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