| // RUN: %clang_cc1 -ast-dump %s | FileCheck %s |
| |
| /* WG14 N1365: Clang 16 |
| * Constant expressions |
| */ |
| |
| // Note: we don't allow you to expand __FLT_EVAL_METHOD__ in the presence of a |
| // pragma that changes its value. However, we can test that we have the correct |
| // constant expression behavior by testing that the AST has the correct implicit |
| // casts, which also specify that the cast was inserted due to an evaluation |
| // method requirement. |
| void func(void) { |
| { |
| #pragma clang fp eval_method(double) |
| _Static_assert(123.0F * 2.0F == 246.0F, ""); |
| // CHECK: StaticAssertDecl |
| // CHECK-NEXT: ImplicitCastExpr {{.*}} '_Bool' <IntegralToBoolean> |
| // CHECK-NEXT: BinaryOperator {{.*}} 'int' '==' |
| // CHECK-NEXT: BinaryOperator {{.*}} 'double' '*' FPEvalMethod=1 |
| // CHECK-NEXT: ImplicitCastExpr {{.*}} 'double' <FloatingCast> FPEvalMethod=1 |
| // CHECK-NEXT: FloatingLiteral |
| // CHECK-NEXT: ImplicitCastExpr {{.*}} 'double' <FloatingCast> FPEvalMethod=1 |
| // CHECK-NEXT: FloatingLiteral |
| |
| // Ensure that a cast removes the extra precision. |
| _Static_assert(123.0F * 2.0F == 246.0F, ""); |
| // CHECK: StaticAssertDecl |
| // CHECK-NEXT: ImplicitCastExpr {{.*}} '_Bool' <IntegralToBoolean> |
| // CHECK-NEXT: BinaryOperator {{.*}} 'int' '==' |
| // CHECK-NEXT: BinaryOperator {{.*}} 'double' '*' FPEvalMethod=1 |
| // CHECK-NEXT: ImplicitCastExpr {{.*}} 'double' <FloatingCast> FPEvalMethod=1 |
| // CHECK-NEXT: FloatingLiteral |
| // CHECK-NEXT: ImplicitCastExpr {{.*}} 'double' <FloatingCast> FPEvalMethod=1 |
| // CHECK-NEXT: FloatingLiteral |
| } |
| |
| { |
| #pragma clang fp eval_method(extended) |
| _Static_assert(123.0F * 2.0F == 246.0F, ""); |
| // CHECK: StaticAssertDecl |
| // CHECK-NEXT: ImplicitCastExpr {{.*}} '_Bool' <IntegralToBoolean> |
| // CHECK-NEXT: BinaryOperator {{.*}} 'int' '==' |
| // CHECK-NEXT: BinaryOperator {{.*}} 'long double' '*' FPEvalMethod=2 |
| // CHECK-NEXT: ImplicitCastExpr {{.*}} 'long double' <FloatingCast> FPEvalMethod=2 |
| // CHECK-NEXT: FloatingLiteral |
| // CHECK-NEXT: ImplicitCastExpr {{.*}} 'long double' <FloatingCast> FPEvalMethod=2 |
| // CHECK-NEXT: FloatingLiteral |
| } |
| |
| { |
| #pragma clang fp eval_method(source) |
| _Static_assert(123.0F * 2.0F == 246.0F, ""); |
| // CHECK: StaticAssertDecl |
| // CHECK-NEXT: ImplicitCastExpr {{.*}} '_Bool' <IntegralToBoolean> |
| // CHECK-NEXT: BinaryOperator {{.*}} 'int' '==' |
| // CHECK-NEXT: BinaryOperator {{.*}} 'float' '*' FPEvalMethod=0 |
| // CHECK-NEXT: FloatingLiteral |
| // CHECK-NEXT: FloatingLiteral |
| } |
| } |