diff options
author | Serge Pavlov <sepavloff@gmail.com> | 2020-09-12 14:30:44 +0700 |
---|---|---|
committer | Serge Pavlov <sepavloff@gmail.com> | 2020-09-12 14:30:44 +0700 |
commit | 6c8041aa0ffed827636935e59c489b1e390c8542 (patch) | |
tree | 75d0b11355a52ae5400f49d4ba96bfb997f447b9 /clang/lib/Sema/SemaInit.cpp | |
parent | 0680a3d56d8b5bcb6647a1149f0de156f72edf91 (diff) | |
download | llvm-6c8041aa0ffed827636935e59c489b1e390c8542.zip llvm-6c8041aa0ffed827636935e59c489b1e390c8542.tar.gz llvm-6c8041aa0ffed827636935e59c489b1e390c8542.tar.bz2 |
[AST][FPEnv] Keep FP options in trailing storage of CastExpr
This change allow a CastExpr to have optional FPOptionsOverride object,
stored in trailing storage. Of all cast nodes only ImplicitCastExpr,
CStyleCastExpr, CXXFunctionalCastExpr and CXXStaticCastExpr are allowed
to have FPOptions.
Differential Revision: https://reviews.llvm.org/D85960
Diffstat (limited to 'clang/lib/Sema/SemaInit.cpp')
-rw-r--r-- | clang/lib/Sema/SemaInit.cpp | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp index f63d600..b6bd6cf 100644 --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -2891,7 +2891,8 @@ InitListChecker::CheckDesignatedInitializer(const InitializedEntity &Entity, Context, CodeUnit, PromotedCharTy, SubExpr->getExprLoc()); if (CharTy != PromotedCharTy) Init = ImplicitCastExpr::Create(Context, CharTy, CK_IntegralCast, - Init, nullptr, VK_RValue); + Init, nullptr, VK_RValue, + SemaRef.CurFPFeatureOverrides()); StructuredList->updateInit(Context, i, Init); } } else { @@ -2913,7 +2914,8 @@ InitListChecker::CheckDesignatedInitializer(const InitializedEntity &Entity, Context, CodeUnit, PromotedCharTy, SubExpr->getExprLoc()); if (CharTy != PromotedCharTy) Init = ImplicitCastExpr::Create(Context, CharTy, CK_IntegralCast, - Init, nullptr, VK_RValue); + Init, nullptr, VK_RValue, + SemaRef.CurFPFeatureOverrides()); StructuredList->updateInit(Context, i, Init); } } @@ -8019,9 +8021,9 @@ ExprResult InitializationSequence::Perform(Sema &S, (Step->Kind == SK_CastDerivedToBaseXValue ? VK_XValue : VK_RValue); - CurInit = - ImplicitCastExpr::Create(S.Context, Step->Type, CK_DerivedToBase, - CurInit.get(), &BasePath, VK); + CurInit = ImplicitCastExpr::Create( + S.Context, Step->Type, CK_DerivedToBase, CurInit.get(), &BasePath, VK, + S.CurFPFeatureOverrides()); break; } @@ -8150,9 +8152,9 @@ ExprResult InitializationSequence::Perform(Sema &S, if (CreatedObject && checkAbstractType(CurInit.get()->getType())) return ExprError(); - CurInit = ImplicitCastExpr::Create(S.Context, CurInit.get()->getType(), - CastKind, CurInit.get(), nullptr, - CurInit.get()->getValueKind()); + CurInit = ImplicitCastExpr::Create( + S.Context, CurInit.get()->getType(), CastKind, CurInit.get(), nullptr, + CurInit.get()->getValueKind(), S.CurFPFeatureOverrides()); if (shouldBindAsTemporary(Entity)) // The overall entity is temporary, so this expression should be @@ -8493,9 +8495,9 @@ ExprResult InitializationSequence::Perform(Sema &S, break; case SK_ProduceObjCObject: - CurInit = - ImplicitCastExpr::Create(S.Context, Step->Type, CK_ARCProduceObject, - CurInit.get(), nullptr, VK_RValue); + CurInit = ImplicitCastExpr::Create( + S.Context, Step->Type, CK_ARCProduceObject, CurInit.get(), nullptr, + VK_RValue, S.CurFPFeatureOverrides()); break; case SK_StdInitializerList: { @@ -8549,9 +8551,9 @@ ExprResult InitializationSequence::Perform(Sema &S, // Case 1b and 1c // No cast from integer to sampler is needed. if (!Var->hasGlobalStorage()) { - CurInit = ImplicitCastExpr::Create(S.Context, Step->Type, - CK_LValueToRValue, Init, - /*BasePath=*/nullptr, VK_RValue); + CurInit = ImplicitCastExpr::Create( + S.Context, Step->Type, CK_LValueToRValue, Init, + /*BasePath=*/nullptr, VK_RValue, S.CurFPFeatureOverrides()); break; } // Case 1a |