From e5578013b199e142864cbf374b4a143e5d0c184a Mon Sep 17 00:00:00 2001 From: Melanie Blower Date: Wed, 6 May 2020 11:45:55 -0700 Subject: [PATCH] When pragma FENV_ACCESS is ignored do not modify Sema.CurFPFeatures Bug reported by @uabelho against reviews.llvm.org/D72841 Reviewers: rjmccall Differential Revision: https://reviews.llvm.org/D79510 --- clang/lib/Parse/ParsePragma.cpp | 1 + clang/test/CodeGen/fp-floatcontrol-pragma.cpp | 14 ++++++++++++++ clang/test/Parser/fp-floatcontrol-syntax.cpp | 5 +++-- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/clang/lib/Parse/ParsePragma.cpp b/clang/lib/Parse/ParsePragma.cpp index 8adf978..828d429 100644 --- a/clang/lib/Parse/ParsePragma.cpp +++ b/clang/lib/Parse/ParsePragma.cpp @@ -108,6 +108,7 @@ struct PragmaSTDC_FENV_ACCESSHandler : public PragmaHandler { return; if (OOS == tok::OOS_ON) { PP.Diag(Tok, diag::warn_stdc_fenv_access_not_supported); + return; } MutableArrayRef Toks(PP.getPreprocessorAllocator().Allocate(1), diff --git a/clang/test/CodeGen/fp-floatcontrol-pragma.cpp b/clang/test/CodeGen/fp-floatcontrol-pragma.cpp index caaab3c..773cfcd 100644 --- a/clang/test/CodeGen/fp-floatcontrol-pragma.cpp +++ b/clang/test/CodeGen/fp-floatcontrol-pragma.cpp @@ -1,4 +1,5 @@ // RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -o - %s | FileCheck %s +// RUN: %clang_cc1 -verify -DFENV_ON=1 -triple x86_64-linux-gnu -emit-llvm -o - %s | FileCheck %s float fff(float x, float y) { // CHECK-LABEL: define float @_Z3fffff{{.*}} @@ -38,6 +39,7 @@ float check_precise(float x, float y) { } return z; } + float fma_test1(float a, float b, float c) { // CHECK-LABEL define float @_Z9fma_test1fff{{.*}} #pragma float_control(precise, on) @@ -45,3 +47,15 @@ float fma_test1(float a, float b, float c) { //CHECK: fmuladd return x; } + +#if FENV_ON +// expected-warning@+1{{pragma STDC FENV_ACCESS ON is not supported, ignoring pragma}} +#pragma STDC FENV_ACCESS ON +#endif +// CHECK-LABEL: define {{.*}}callt{{.*}} + +void callt() { + volatile float z; + z = z * z; +//CHECK: = fmul float +} diff --git a/clang/test/Parser/fp-floatcontrol-syntax.cpp b/clang/test/Parser/fp-floatcontrol-syntax.cpp index a730372..4bdc34d 100644 --- a/clang/test/Parser/fp-floatcontrol-syntax.cpp +++ b/clang/test/Parser/fp-floatcontrol-syntax.cpp @@ -30,14 +30,15 @@ double b = 1.0; // document the warning #ifdef FAST // expected-warning@+1{{pragma STDC FENV_ACCESS ON is not supported, ignoring pragma}} -#pragma STDC FENV_ACCESS ON // expected-error{{'#pragma STDC FENV_ACCESS ON' is illegal when precise is disabled}} +#pragma STDC FENV_ACCESS ON #else #pragma STDC FENV_ACCESS ON // expected-warning{{pragma STDC FENV_ACCESS ON is not supported, ignoring pragma}} #endif #ifdef STRICT #pragma float_control(precise, off) // expected-error {{'#pragma float_control(precise, off)' is illegal when except is enabled}} #else -#pragma float_control(precise, off) // expected-error {{'#pragma float_control(precise, off)' is illegal when fenv_access is enabled}} +// Currently FENV_ACCESS cannot be enabled by pragma, skip error check +#pragma float_control(precise, off) // not-expected-error {{'#pragma float_control(precise, off)' is illegal when fenv_access is enabled}} #endif #pragma float_control(precise, on) -- 2.7.4