pragma float_control(push) or (pop)

I was a little surprised by this behavior. I was trying to write a header file that would use file scope pragma float_control(push) and pragma float_control(pop) and ran into this error. It seems like this makes these pragmas pretty difficult to be effectively used.

Thank you,

Kevin Smith

$ clang bad.cpp

bad.cpp:2:9: error: ‘#pragma float_control push/pop’ can only appear at file scope or namespace scope

#pragma float_control(push)

^

bad.cpp:9:9: error: ‘#pragma float_control push/pop’ can only appear at file scope or namespace scope

#pragma float_control(pop)

^

2 errors generated.

$ cat bad.cpp

extern “C++” {

#pragma float_control(push)

#pragma clang fp reassociate(off)

float my_silly_func(float a, float b) {

return (a + b) - b;

}

#pragma float_control(pop)

}

I suspect this is just a bug and the code meant to say (untested):

diff --git clang/lib/Sema/SemaAttr.cpp clang/lib/Sema/SemaAttr.cpp

index fe8f02f02368…2277e08d9b05 100644

— clang/lib/Sema/SemaAttr.cpp

+++ clang/lib/Sema/SemaAttr.cpp

@@ -475,7 +475,7 @@ void Sema::ActOnPragmaFloatControl(SourceLocation Loc,

PragmaFloatControlKind Value) {

FPOptionsOverride NewFPFeatures = CurFPFeatureOverrides();

if ((Action == PSK_Push_Set || Action == PSK_Push || Action == PSK_Pop) &&

  • !(CurContext->isTranslationUnit()) && !CurContext->isNamespace()) {
  • !CurContext->getRedeclContext()->isFileContext()) {

// Push and pop can only occur at file or namespace scope.

Diag(Loc, diag::err_pragma_fc_pp_scope);

return;

I suspect this is just a bug and the code meant to say (untested):

diff --git clang/lib/Sema/SemaAttr.cpp clang/lib/Sema/SemaAttr.cpp

index fe8f02f02368..2277e08d9b05 100644

--- clang/lib/Sema/SemaAttr.cpp

+++ clang/lib/Sema/SemaAttr.cpp

@@ -475,7 +475,7 @@ void Sema::ActOnPragmaFloatControl(SourceLocation Loc,

                                    PragmaFloatControlKind Value) {

   FPOptionsOverride NewFPFeatures = CurFPFeatureOverrides();

   if ((Action == PSK_Push_Set || Action == PSK_Push || Action == PSK_Pop) &&

- !(CurContext->isTranslationUnit()) && !CurContext->isNamespace()) {

+ !CurContext->getRedeclContext()->isFileContext()) {

     // Push and pop can only occur at file or namespace scope.

     Diag(Loc, diag::err_pragma_fc_pp_scope);

     return;

Oh, good suggestion James! I'll change what I did in
https://reviews.llvm.org/rGb0ef3d8f666fa6008abb09340b73d9340d442569 to
use this approach instead.

~Aaron