xref: /llvm-project/clang/test/C/C11/n1365.c (revision 5184e6ad69b0ca69dfba6fb0982a675c595f49a2)
1 // RUN: %clang_cc1 -ast-dump %s | FileCheck %s
2 
3 /* WG14 N1365: Clang 16
4  * Constant expressions
5  */
6 
7 // Note: we don't allow you to expand __FLT_EVAL_METHOD__ in the presence of a
8 // pragma that changes its value. However, we can test that we have the correct
9 // constant expression behavior by testing that the AST has the correct implicit
10 // casts, which also specify that the cast was inserted due to an evaluation
11 // method requirement.
func(void)12 void func(void) {
13   {
14     #pragma clang fp eval_method(double)
15     _Static_assert(123.0F * 2.0F == 246.0F, "");
16     // CHECK: StaticAssertDecl
17     // CHECK-NEXT: ImplicitCastExpr {{.*}} '_Bool' <IntegralToBoolean>
18     // CHECK-NEXT: BinaryOperator {{.*}} 'int' '=='
19     // CHECK-NEXT: BinaryOperator {{.*}} 'double' '*' FPEvalMethod=1
20     // CHECK-NEXT: ImplicitCastExpr {{.*}} 'double' <FloatingCast> FPEvalMethod=1
21     // CHECK-NEXT: FloatingLiteral
22     // CHECK-NEXT: ImplicitCastExpr {{.*}} 'double' <FloatingCast> FPEvalMethod=1
23     // CHECK-NEXT: FloatingLiteral
24 
25     // Ensure that a cast removes the extra precision.
26     _Static_assert(123.0F * 2.0F == 246.0F, "");
27     // CHECK: StaticAssertDecl
28     // CHECK-NEXT: ImplicitCastExpr {{.*}} '_Bool' <IntegralToBoolean>
29     // CHECK-NEXT: BinaryOperator {{.*}} 'int' '=='
30     // CHECK-NEXT: BinaryOperator {{.*}} 'double' '*' FPEvalMethod=1
31     // CHECK-NEXT: ImplicitCastExpr {{.*}} 'double' <FloatingCast> FPEvalMethod=1
32     // CHECK-NEXT: FloatingLiteral
33     // CHECK-NEXT: ImplicitCastExpr {{.*}} 'double' <FloatingCast> FPEvalMethod=1
34     // CHECK-NEXT: FloatingLiteral
35   }
36 
37   {
38     #pragma clang fp eval_method(extended)
39     _Static_assert(123.0F * 2.0F == 246.0F, "");
40     // CHECK: StaticAssertDecl
41     // CHECK-NEXT: ImplicitCastExpr {{.*}} '_Bool' <IntegralToBoolean>
42     // CHECK-NEXT: BinaryOperator {{.*}} 'int' '=='
43     // CHECK-NEXT: BinaryOperator {{.*}} 'long double' '*' FPEvalMethod=2
44     // CHECK-NEXT: ImplicitCastExpr {{.*}} 'long double' <FloatingCast> FPEvalMethod=2
45     // CHECK-NEXT: FloatingLiteral
46     // CHECK-NEXT: ImplicitCastExpr {{.*}} 'long double' <FloatingCast> FPEvalMethod=2
47     // CHECK-NEXT: FloatingLiteral
48   }
49 
50   {
51     #pragma clang fp eval_method(source)
52     _Static_assert(123.0F * 2.0F == 246.0F, "");
53     // CHECK: StaticAssertDecl
54     // CHECK-NEXT: ImplicitCastExpr {{.*}} '_Bool' <IntegralToBoolean>
55     // CHECK-NEXT: BinaryOperator {{.*}} 'int' '=='
56     // CHECK-NEXT: BinaryOperator {{.*}} 'float' '*' FPEvalMethod=0
57     // CHECK-NEXT: FloatingLiteral
58     // CHECK-NEXT: FloatingLiteral
59   }
60 }
61