// RUN: %clang_cc1 -fexperimental-strict-floating-point \ // RUN: -triple x86_64-linux-gnu -emit-llvm -o - -verify %s // // RUN: %clang_cc1 -fexperimental-strict-floating-point \ // RUN: -triple x86_64-linux-gnu -emit-llvm -o - -verify %s \ // RUN: -ffp-eval-method=source // // RUN: %clang_cc1 -fexperimental-strict-floating-point \ // RUN: -triple x86_64-linux-gnu -emit-llvm -o - -verify %s \ // RUN: -ffp-eval-method=double extern "C" int printf(const char *, ...); void foo1() { printf("FP: %d\n", __FLT_EVAL_METHOD__); } void apply_pragma() { // expected-note@+1{{#pragma entered here}} #pragma clang fp eval_method(double) // expected-error@+1{{'__FLT_EVAL_METHOD__' cannot be expanded inside a scope containing '#pragma clang fp eval_method'}} printf("FP: %d\n", __FLT_EVAL_METHOD__); } int foo2() { apply_pragma(); return 0; } void apply_pragma_with_wrong_value() { // expected-error@+1{{unexpected argument 'value' to '#pragma clang fp eval_method'; expected 'source', 'double' or 'extended'}} #pragma clang fp eval_method(value) } int foo3() { apply_pragma_with_wrong_value(); return 0; } void foo() { auto a = __FLT_EVAL_METHOD__; { // expected-note@+1{{#pragma entered here}} #pragma clang fp eval_method(double) // expected-error@+1{{'__FLT_EVAL_METHOD__' cannot be expanded inside a scope containing '#pragma clang fp eval_method'}} auto b = __FLT_EVAL_METHOD__; } auto c = __FLT_EVAL_METHOD__; } void func() { { { #pragma clang fp eval_method(source) } int i = __FLT_EVAL_METHOD__; // ok, not in a scope changed by the pragma } { // expected-note@+1{{#pragma entered here}} #pragma clang fp eval_method(source) // expected-error@+1{{'__FLT_EVAL_METHOD__' cannot be expanded inside a scope containing '#pragma clang fp eval_method'}} int i = __FLT_EVAL_METHOD__; } } float G; int f(float x, float y, float z) { G = x * y + z; return __FLT_EVAL_METHOD__; } int foo(int flag, float x, float y, float z) { if (flag) { // expected-note@+1{{#pragma entered here}} #pragma clang fp eval_method(double) G = x + y + z; // expected-error@+1{{'__FLT_EVAL_METHOD__' cannot be expanded inside a scope containing '#pragma clang fp eval_method'}} return __FLT_EVAL_METHOD__; } else { // expected-note@+1{{#pragma entered here}} #pragma clang fp eval_method(extended) G = x + y + z; // expected-error@+1{{'__FLT_EVAL_METHOD__' cannot be expanded inside a scope containing '#pragma clang fp eval_method'}} return __FLT_EVAL_METHOD__; } } #if __FLT_EVAL_METHOD__ == 1 #endif #pragma clang fp eval_method(source) // expected-note@+1{{#pragma entered here}} #pragma clang fp eval_method(double) // expected-error@+1{{'__FLT_EVAL_METHOD__' cannot be expanded inside a scope containing '#pragma clang fp eval_method'}} #if __FLT_EVAL_METHOD__ == 1 #endif