// RUN: %clang_cc1 -fsyntax-only -triple x86_64-pc-linux -ast-print %s -o - | FileCheck %s float func_1(float x, float y) { #pragma STDC FENV_ACCESS ON if (x != 0) { return y; } return x + y; } // CHECK-LABEL: float func_1(float x, float y) { // CHECK-NEXT: #pragma STDC FENV_ACCESS ON // CHECK-NEXT: if (x != 0) { // CHECK-NEXT: return y; // CHECK-NEXT: } // CHECK-NEXT: return x + y; // CHECK-NEXT: } float func_2(float x, float y) { #pragma STDC FENV_ACCESS ON if (x != 0) { #pragma STDC FENV_ACCESS OFF return y; } return x + y; } // CHECK-LABEL: float func_2(float x, float y) { // CHECK-NEXT: #pragma STDC FENV_ACCESS ON // CHECK-NEXT: if (x != 0) { // CHECK-NEXT: #pragma STDC FENV_ACCESS OFF // CHECK-NEXT: return y; // CHECK-NEXT: } // CHECK-NEXT: return x + y; // CHECK-NEXT: } float func_3(float x, float y) { #pragma STDC FENV_ROUND FE_DOWNWARD return x + y; } // CHECK-LABEL: float func_3(float x, float y) { // CHECK-NEXT: #pragma STDC FENV_ROUND FE_DOWNWARD // CHECK-NEXT: return x + y; // CHECK-NEXT: } float func_4(float x, float y, float z) { #pragma STDC FENV_ACCESS ON #pragma clang fp exceptions(maytrap) #pragma STDC FENV_ROUND FE_UPWARD if (z != 0) { #pragma STDC FENV_ACCESS OFF #pragma STDC FENV_ROUND FE_TOWARDZERO return z + x; } return x + y; } // CHECK-LABEL: float func_4(float x, float y, float z) { // CHECK-NEXT: #pragma STDC FENV_ACCESS ON // CHECK-NEXT: #pragma clang fp exceptions(maytrap) // CHECK-NEXT: #pragma STDC FENV_ROUND FE_UPWARD // CHECK-NEXT: if (z != 0) { // CHECK-NEXT: #pragma STDC FENV_ACCESS OFF // CHECK-NEXT: #pragma STDC FENV_ROUND FE_TOWARDZERO // CHECK-NEXT: return z + x; // CHECK-NEXT: } // CHECK-NEXT: return x + y; // CHECK-NEXT: }