xref: /llvm-project/clang/test/Parser/fp-floatcontrol-syntax.cpp (revision 69aacaf699922ffe0450f567e21208c10c84731f)
1 // RUN: %clang_cc1 -fsyntax-only -verify -DCHECK_ERROR %s
2 
3 float function_scope(float a) {
4 #pragma float_control(precise, on) junk // expected-warning {{extra tokens at end of '#pragma float_control' - ignored}}
5   return a;
6 }
7 
8 #ifdef CHECK_ERROR
9 #pragma float_control(push)
10 #pragma float_control(pop)
11 #pragma float_control(precise, on, push)
12 void check_stack() {
13 #pragma float_control(push)                   // expected-error {{can only appear at file scope}}
14 #pragma float_control(pop)                    // expected-error {{can only appear at file scope}}
15 #pragma float_control(precise, on, push)      // expected-error {{can only appear at file scope}}
16 #pragma float_control(except, on, push)       // expected-error {{can only appear at file scope}}
17 #pragma float_control(except, on, push, junk) // expected-error {{float_control is malformed}}
18   return;
19 }
20 #endif
21 
22 // RUN: %clang -c -fsyntax-only %s -DDEFAULT -Xclang -verify
23 // RUN: %clang -c -fsyntax-only %s -ffp-model=precise -DPRECISE -Xclang -verify
24 // RUN: %clang -c -fsyntax-only %s -ffp-model=strict -DSTRICT -Xclang -verify
25 // RUN: %clang -c -fsyntax-only %s -ffp-model=fast -DFAST -Xclang -verify
26 double a = 0.0;
27 double b = 1.0;
28 
29 //FIXME At some point this warning will be removed, until then
30 //      document the warning
31 #ifdef FAST
32 // expected-warning@+1{{pragma STDC FENV_ACCESS ON is not supported, ignoring pragma}}
33 #pragma STDC FENV_ACCESS ON // expected-error{{'#pragma STDC FENV_ACCESS ON' is illegal when precise is disabled}}
34 #else
35 #pragma STDC FENV_ACCESS ON // expected-warning{{pragma STDC FENV_ACCESS ON is not supported, ignoring pragma}}
36 #endif
37 #ifdef STRICT
38 #pragma float_control(precise, off) // expected-error {{'#pragma float_control(precise, off)' is illegal when except is enabled}}
39 #else
40 #pragma float_control(precise, off) // expected-error {{'#pragma float_control(precise, off)' is illegal when fenv_access is enabled}}
41 #endif
42 //RUN -ffp-model=strict
43 //error: '#pragma float_control(precise, off)' is illegal when except is enabled
44 //with default, fast or precise: no errors
45 
46 #pragma float_control(precise, on)
47 #pragma float_control(except, on) // OK
48 #ifndef STRICT
49 #pragma float_control(except, on)
50 #pragma float_control(precise, off) // expected-error {{'#pragma float_control(precise, off)' is illegal when except is enabled}}
51 #endif
52 int main() {
53 #ifdef STRICT
54 #pragma float_control(precise, off) // expected-error {{'#pragma float_control(precise, off)' is illegal when except is enabled}}
55 #else
56 #pragma float_control(precise, off) // expected-error {{'#pragma float_control(precise, off)' is illegal when except is enabled}}
57 #endif
58 #pragma float_control(except, on)
59   //  error: '#pragma float_control(except, on)' is illegal when precise is disabled
60   double x = b / a; // only used for fp flag setting
61   if (a == a)       // only used for fp flag setting
62     return 0;       //(int)x;
63 }
64