eval_musteval.carbon 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. // Part of the Carbon Language project, under the Apache License v2.0 with LLVM
  2. // Exceptions. See /LICENSE for license information.
  3. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. //
  5. // INCLUDE-FILE: toolchain/testing/testdata/min_prelude/int.carbon
  6. //
  7. // AUTOUPDATE
  8. // TIP: To test this file alone, run:
  9. // TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/function/declaration/eval_musteval.carbon
  10. // TIP: To dump output, run:
  11. // TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/function/declaration/eval_musteval.carbon
  12. // --- basic.carbon
  13. library "[[@TEST_NAME]]";
  14. fn Basic() -> i32 { return 0; }
  15. eval fn Eval() -> i32 { return 0; }
  16. musteval fn MustEval() -> i32 { return 0; }
  17. // --- member.carbon
  18. library "[[@TEST_NAME]]";
  19. class C {
  20. eval fn Eval() {}
  21. musteval fn MustEval() {}
  22. }
  23. // --- private.carbon
  24. library "[[@TEST_NAME]]";
  25. private eval fn Eval() -> i32 { return 0; }
  26. private musteval fn MustEval() -> i32 { return 0; }
  27. // --- fail_conflict.carbon
  28. library "[[@TEST_NAME]]";
  29. // CHECK:STDERR: fail_conflict.carbon:[[@LINE+7]]:6: error: `musteval` not allowed on declaration with `eval` [ModifierNotAllowedWith]
  30. // CHECK:STDERR: eval musteval fn Mixed();
  31. // CHECK:STDERR: ^~~~~~~~
  32. // CHECK:STDERR: fail_conflict.carbon:[[@LINE+4]]:1: note: `eval` previously appeared here [ModifierPrevious]
  33. // CHECK:STDERR: eval musteval fn Mixed();
  34. // CHECK:STDERR: ^~~~
  35. // CHECK:STDERR:
  36. eval musteval fn Mixed();
  37. // --- fail_order.carbon
  38. library "[[@TEST_NAME]]";
  39. // CHECK:STDERR: fail_order.carbon:[[@LINE+7]]:6: error: `export` must appear before `eval` [ModifierMustAppearBefore]
  40. // CHECK:STDERR: eval export fn ExportEval();
  41. // CHECK:STDERR: ^~~~~~
  42. // CHECK:STDERR: fail_order.carbon:[[@LINE+4]]:1: note: `eval` previously appeared here [ModifierPrevious]
  43. // CHECK:STDERR: eval export fn ExportEval();
  44. // CHECK:STDERR: ^~~~
  45. // CHECK:STDERR:
  46. eval export fn ExportEval();
  47. // CHECK:STDERR: fail_order.carbon:[[@LINE+7]]:6: error: `private` must appear before `eval` [ModifierMustAppearBefore]
  48. // CHECK:STDERR: eval private fn PrivateEval();
  49. // CHECK:STDERR: ^~~~~~~
  50. // CHECK:STDERR: fail_order.carbon:[[@LINE+4]]:1: note: `eval` previously appeared here [ModifierPrevious]
  51. // CHECK:STDERR: eval private fn PrivateEval();
  52. // CHECK:STDERR: ^~~~
  53. // CHECK:STDERR:
  54. eval private fn PrivateEval();
  55. class C {
  56. // CHECK:STDERR: fail_order.carbon:[[@LINE+7]]:8: error: `virtual` must appear before `eval` [ModifierMustAppearBefore]
  57. // CHECK:STDERR: eval virtual fn VirtualEval();
  58. // CHECK:STDERR: ^~~~~~~
  59. // CHECK:STDERR: fail_order.carbon:[[@LINE+4]]:3: note: `eval` previously appeared here [ModifierPrevious]
  60. // CHECK:STDERR: eval virtual fn VirtualEval();
  61. // CHECK:STDERR: ^~~~
  62. // CHECK:STDERR:
  63. eval virtual fn VirtualEval();
  64. }
  65. // --- fail_not_fn.carbon
  66. library "[[@TEST_NAME]]";
  67. // CHECK:STDERR: fail_not_fn.carbon:[[@LINE+4]]:1: error: `eval` not allowed on `var` declaration [ModifierNotAllowedOnDeclaration]
  68. // CHECK:STDERR: eval var x: i32;
  69. // CHECK:STDERR: ^~~~
  70. // CHECK:STDERR:
  71. eval var x: i32;
  72. // CHECK:STDERR: fail_not_fn.carbon:[[@LINE+4]]:1: error: `eval` not allowed on `class` declaration [ModifierNotAllowedOnDeclaration]
  73. // CHECK:STDERR: eval class C {};
  74. // CHECK:STDERR: ^~~~
  75. // CHECK:STDERR:
  76. eval class C {};
  77. // --- redecl.carbon
  78. library "[[@TEST_NAME]]";
  79. eval fn A() -> i32;
  80. eval fn A() -> i32 { return 0; }
  81. musteval fn B() -> i32;
  82. musteval fn B() -> i32 { return 0; }
  83. // --- fail_differ_in_redecl.carbon
  84. library "[[@TEST_NAME]]";
  85. fn NoneThenEval();
  86. fn NoneThenMustEval();
  87. eval fn EvalThenNone();
  88. eval fn EvalThenMustEval();
  89. musteval fn MustEvalThenNone();
  90. musteval fn MustEvalThenEval();
  91. // CHECK:STDERR: fail_differ_in_redecl.carbon:[[@LINE+7]]:1: error: function redeclaration differs because new function is `eval` [FunctionRedeclEvaluationModeDiffers]
  92. // CHECK:STDERR: eval fn NoneThenEval() {}
  93. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~
  94. // CHECK:STDERR: fail_differ_in_redecl.carbon:[[@LINE-10]]:1: note: previously not declared as `eval` [FunctionRedeclEvaluationModePrevious]
  95. // CHECK:STDERR: fn NoneThenEval();
  96. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~
  97. // CHECK:STDERR:
  98. eval fn NoneThenEval() {}
  99. // CHECK:STDERR: fail_differ_in_redecl.carbon:[[@LINE+7]]:1: error: function redeclaration differs because new function is `musteval` [FunctionRedeclEvaluationModeDiffers]
  100. // CHECK:STDERR: musteval fn NoneThenMustEval() {}
  101. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  102. // CHECK:STDERR: fail_differ_in_redecl.carbon:[[@LINE-18]]:1: note: previously not declared as `musteval` [FunctionRedeclEvaluationModePrevious]
  103. // CHECK:STDERR: fn NoneThenMustEval();
  104. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~
  105. // CHECK:STDERR:
  106. musteval fn NoneThenMustEval() {}
  107. // CHECK:STDERR: fail_differ_in_redecl.carbon:[[@LINE+7]]:1: error: function redeclaration differs because new function is not `eval` [FunctionRedeclEvaluationModeDiffers]
  108. // CHECK:STDERR: fn EvalThenNone() {}
  109. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~
  110. // CHECK:STDERR: fail_differ_in_redecl.carbon:[[@LINE-26]]:1: note: previously declared as `eval` [FunctionRedeclEvaluationModePrevious]
  111. // CHECK:STDERR: eval fn EvalThenNone();
  112. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~
  113. // CHECK:STDERR:
  114. fn EvalThenNone() {}
  115. // CHECK:STDERR: fail_differ_in_redecl.carbon:[[@LINE+7]]:1: error: function redeclaration differs because new function is `musteval` [FunctionRedeclEvaluationModeDiffers]
  116. // CHECK:STDERR: musteval fn EvalThenMustEval() {}
  117. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  118. // CHECK:STDERR: fail_differ_in_redecl.carbon:[[@LINE-34]]:1: note: previously declared as `eval` [FunctionRedeclEvaluationModePrevious]
  119. // CHECK:STDERR: eval fn EvalThenMustEval();
  120. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~
  121. // CHECK:STDERR:
  122. musteval fn EvalThenMustEval() {}
  123. // CHECK:STDERR: fail_differ_in_redecl.carbon:[[@LINE+7]]:1: error: function redeclaration differs because new function is not `musteval` [FunctionRedeclEvaluationModeDiffers]
  124. // CHECK:STDERR: fn MustEvalThenNone() {}
  125. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~
  126. // CHECK:STDERR: fail_differ_in_redecl.carbon:[[@LINE-42]]:1: note: previously declared as `musteval` [FunctionRedeclEvaluationModePrevious]
  127. // CHECK:STDERR: musteval fn MustEvalThenNone();
  128. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  129. // CHECK:STDERR:
  130. fn MustEvalThenNone() {}
  131. // CHECK:STDERR: fail_differ_in_redecl.carbon:[[@LINE+7]]:1: error: function redeclaration differs because new function is `eval` [FunctionRedeclEvaluationModeDiffers]
  132. // CHECK:STDERR: eval fn MustEvalThenEval() {}
  133. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
  134. // CHECK:STDERR: fail_differ_in_redecl.carbon:[[@LINE-50]]:1: note: previously declared as `musteval` [FunctionRedeclEvaluationModePrevious]
  135. // CHECK:STDERR: musteval fn MustEvalThenEval();
  136. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  137. // CHECK:STDERR:
  138. eval fn MustEvalThenEval() {}