xref: /llvm-project/clang/test/Sema/fp-eval-pragma.cpp (revision 15ef06f453c6f9513b476e80dd9567d01fc662e8)
1 // RUN: %clang_cc1 -fexperimental-strict-floating-point \
2 // RUN: -triple x86_64-linux-gnu -emit-llvm -o - -verify %s
3 //
4 // RUN: %clang_cc1 -fexperimental-strict-floating-point \
5 // RUN: -triple x86_64-linux-gnu -emit-llvm -o - -verify %s \
6 // RUN: -ffp-eval-method=source
7 //
8 // RUN: %clang_cc1 -fexperimental-strict-floating-point \
9 // RUN: -triple x86_64-linux-gnu -emit-llvm -o - -verify %s \
10 // RUN: -ffp-eval-method=double
11 
12 extern "C" int printf(const char *, ...);
13 
foo1()14 void foo1() {
15   printf("FP: %d\n", __FLT_EVAL_METHOD__);
16 }
17 
apply_pragma()18 void apply_pragma() {
19   // expected-note@+1{{#pragma entered here}}
20 #pragma clang fp eval_method(double)
21   // expected-error@+1{{'__FLT_EVAL_METHOD__' cannot be expanded inside a scope containing '#pragma clang fp eval_method'}}
22   printf("FP: %d\n", __FLT_EVAL_METHOD__);
23 }
24 
foo2()25 int foo2() {
26   apply_pragma();
27   return 0;
28 }
29 
apply_pragma_with_wrong_value()30 void apply_pragma_with_wrong_value() {
31   // expected-error@+1{{unexpected argument 'value' to '#pragma clang fp eval_method'; expected 'source', 'double' or 'extended'}}
32 #pragma clang fp eval_method(value)
33 }
34 
foo3()35 int foo3() {
36   apply_pragma_with_wrong_value();
37   return 0;
38 }
39 
foo()40 void foo() {
41   auto a = __FLT_EVAL_METHOD__;
42   {
43     // expected-note@+1{{#pragma entered here}}
44 #pragma clang fp eval_method(double)
45     // expected-error@+1{{'__FLT_EVAL_METHOD__' cannot be expanded inside a scope containing '#pragma clang fp eval_method'}}
46     auto b = __FLT_EVAL_METHOD__;
47   }
48   auto c = __FLT_EVAL_METHOD__;
49 }
50 
func()51 void func() {
52   {
53     {
54 #pragma clang fp eval_method(source)
55     }
56     int i = __FLT_EVAL_METHOD__; // ok, not in a scope changed by the pragma
57   }
58   {
59     // expected-note@+1{{#pragma entered here}}
60 #pragma clang fp eval_method(source)
61     // expected-error@+1{{'__FLT_EVAL_METHOD__' cannot be expanded inside a scope containing '#pragma clang fp eval_method'}}
62     int i = __FLT_EVAL_METHOD__;
63   }
64 }
65 
66 float G;
67 
f(float x,float y,float z)68 int f(float x, float y, float z) {
69   G = x * y + z;
70   return __FLT_EVAL_METHOD__;
71 }
72 
foo(int flag,float x,float y,float z)73 int foo(int flag, float x, float y, float z) {
74   if (flag) {
75     // expected-note@+1{{#pragma entered here}}
76 #pragma clang fp eval_method(double)
77     G = x + y + z;
78     // expected-error@+1{{'__FLT_EVAL_METHOD__' cannot be expanded inside a scope containing '#pragma clang fp eval_method'}}
79     return __FLT_EVAL_METHOD__;
80   } else {
81     // expected-note@+1{{#pragma entered here}}
82 #pragma clang fp eval_method(extended)
83     G = x + y + z;
84     // expected-error@+1{{'__FLT_EVAL_METHOD__' cannot be expanded inside a scope containing '#pragma clang fp eval_method'}}
85     return __FLT_EVAL_METHOD__;
86   }
87 }
88 
89 #if __FLT_EVAL_METHOD__ == 1
90 #endif
91 #pragma clang fp eval_method(source)
92 
93 // expected-note@+1{{#pragma entered here}}
94 #pragma clang fp eval_method(double)
95 // expected-error@+1{{'__FLT_EVAL_METHOD__' cannot be expanded inside a scope containing '#pragma clang fp eval_method'}}
96 #if __FLT_EVAL_METHOD__ == 1
97 #endif
98