diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -660,6 +660,11 @@ bool hasValue() const { return CurrentValue != DefaultValue; } + void clear() { + Stack.clear(); + CurrentValue = DefaultValue; + } + SmallVector Stack; ValueType DefaultValue; // Value used for PSK_Reset action. ValueType CurrentValue; diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp --- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -4903,6 +4903,11 @@ /*Enabled=*/Recursive); LocalEagerInstantiationScope LocalInstantiations(*this); + // Reset FP option to the state specified by command line. + FpPragmaStack.clear(); + FPFeaturesStateRAII SavedFPFeatures(*this); + CurFPFeatures = FPOptions(getLangOpts()); + // Call the LateTemplateParser callback if there is a need to late parse // a templated function definition. if (!Pattern && PatternDecl->isLateTemplateParsed() && diff --git a/clang/test/CodeGen/fp-template.cpp b/clang/test/CodeGen/fp-template.cpp new file mode 100644 --- /dev/null +++ b/clang/test/CodeGen/fp-template.cpp @@ -0,0 +1,18 @@ +// RUN: %clang_cc1 -triple x86_64-linux-gnu -fdelayed-template-parsing -emit-llvm -o - %s | FileCheck %s + +template +Ty func_01(Ty x, Ty y) { + return x + y; +} + +float func_02(float x, float y) { + return func_01(x, y); +} + +// This pragma sets non-default rounding mode and then delayed parsing occurs. +// Check that the parsing uses FP options defined by command line options and +// not by this pragma. +#pragma STDC FENV_ROUND FE_TOWARDZERO + +// CHECK-LABEL: define {{.*}} float @_Z7func_01IfET_S0_S0_ +// CHECK: %add = fadd float %0, %1