// 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' // CHECK-NEXT: BinaryOperator {{.*}} 'int' '==' // CHECK-NEXT: BinaryOperator {{.*}} 'double' '*' FPEvalMethod=1 // CHECK-NEXT: ImplicitCastExpr {{.*}} 'double' FPEvalMethod=1 // CHECK-NEXT: FloatingLiteral // CHECK-NEXT: ImplicitCastExpr {{.*}} 'double' 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' // CHECK-NEXT: BinaryOperator {{.*}} 'int' '==' // CHECK-NEXT: BinaryOperator {{.*}} 'double' '*' FPEvalMethod=1 // CHECK-NEXT: ImplicitCastExpr {{.*}} 'double' FPEvalMethod=1 // CHECK-NEXT: FloatingLiteral // CHECK-NEXT: ImplicitCastExpr {{.*}} 'double' 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' // CHECK-NEXT: BinaryOperator {{.*}} 'int' '==' // CHECK-NEXT: BinaryOperator {{.*}} 'long double' '*' FPEvalMethod=2 // CHECK-NEXT: ImplicitCastExpr {{.*}} 'long double' FPEvalMethod=2 // CHECK-NEXT: FloatingLiteral // CHECK-NEXT: ImplicitCastExpr {{.*}} 'long double' 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' // CHECK-NEXT: BinaryOperator {{.*}} 'int' '==' // CHECK-NEXT: BinaryOperator {{.*}} 'float' '*' FPEvalMethod=0 // CHECK-NEXT: FloatingLiteral // CHECK-NEXT: FloatingLiteral } }