[clang] Fix bug in #pragma float_control(push/pop)
Summary: #pragma float_control(pop) was failing to restore the expected
floating point settings because the settings were not correctly preserved
at #pragma float_control(push).
diff --git a/clang/lib/Sema/SemaAttr.cpp b/clang/lib/Sema/SemaAttr.cpp
index 222aaf3..977e924 100644
--- a/clang/lib/Sema/SemaAttr.cpp
+++ b/clang/lib/Sema/SemaAttr.cpp
@@ -457,8 +457,12 @@
FpPragmaStack.Act(Loc, Action, StringRef(), NewValue);
break;
case PFC_Push:
- Action = Sema::PSK_Push_Set;
- FpPragmaStack.Act(Loc, Action, StringRef(), NewFPFeatures.getAsOpaqueInt());
+ if (FpPragmaStack.Stack.empty()) {
+ FpPragmaStack.Act(Loc, Sema::PSK_Set, StringRef(),
+ CurFPFeatures.getAsOpaqueInt());
+ }
+ FpPragmaStack.Act(Loc, Sema::PSK_Push_Set, StringRef(),
+ NewFPFeatures.getAsOpaqueInt());
break;
case PFC_Pop:
if (FpPragmaStack.Stack.empty()) {