summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2018-09-26 04:36:55 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2018-09-26 04:36:55 +0000
commit12938cf89968ae3795ba1c249a1ae9b3f09d493a (patch)
treeb74c0d3366734aa9cebbbb0f09019d69072825e3 /clang/lib
parent1408f91a2588243b84ca98799d0988535ef2e72a (diff)
downloadbcm5719-llvm-12938cf89968ae3795ba1c249a1ae9b3f09d493a.tar.gz
bcm5719-llvm-12938cf89968ae3795ba1c249a1ae9b3f09d493a.zip
P0859R0: List-initialization is potentially-constant-evaluated and
triggers instantiation of constexpr functions. We mostly implemented this since Clang 6, but missed the template instantiation case. We do not implement the '&cast-expression' special case. It appears to be a mistake / oversight. I've mailed CWG to see if we can remove it. llvm-svn: 343064
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/Sema/TreeTransform.h41
1 files changed, 32 insertions, 9 deletions
diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h
index 2bee5e7ec82..3ec467a39ca 100644
--- a/clang/lib/Sema/TreeTransform.h
+++ b/clang/lib/Sema/TreeTransform.h
@@ -3386,6 +3386,11 @@ ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,
if (Construct && Construct->isStdInitListInitialization())
return TransformInitializer(Construct->getArg(0), NotCopyInit);
+ // Enter a list-init context if this was list initialization.
+ EnterExpressionEvaluationContext Context(
+ getSema(), EnterExpressionEvaluationContext::InitList,
+ Construct->isListInitialization());
+
SmallVector<Expr*, 8> NewArgs;
bool ArgChanged = false;
if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(),
@@ -9549,6 +9554,9 @@ TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
bool InitChanged = false;
+ EnterExpressionEvaluationContext Context(
+ getSema(), EnterExpressionEvaluationContext::InitList);
+
SmallVector<Expr*, 4> Inits;
if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
Inits, &InitChanged))
@@ -10780,9 +10788,14 @@ TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
bool ArgumentChanged = false;
SmallVector<Expr*, 8> Args;
- if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
- &ArgumentChanged))
- return ExprError();
+ {
+ EnterExpressionEvaluationContext Context(
+ getSema(), EnterExpressionEvaluationContext::InitList,
+ E->isListInitialization());
+ if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
+ &ArgumentChanged))
+ return ExprError();
+ }
if (!getDerived().AlwaysRebuild() &&
T == E->getType() &&
@@ -10865,9 +10878,14 @@ TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
bool ArgumentChanged = false;
SmallVector<Expr*, 8> Args;
Args.reserve(E->getNumArgs());
- if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
- &ArgumentChanged))
- return ExprError();
+ {
+ EnterExpressionEvaluationContext Context(
+ getSema(), EnterExpressionEvaluationContext::InitList,
+ E->isListInitialization());
+ if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
+ &ArgumentChanged))
+ return ExprError();
+ }
if (!getDerived().AlwaysRebuild() &&
T == E->getTypeSourceInfo() &&
@@ -11159,9 +11177,14 @@ TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
bool ArgumentChanged = false;
SmallVector<Expr*, 8> Args;
Args.reserve(E->arg_size());
- if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args,
- &ArgumentChanged))
- return ExprError();
+ {
+ EnterExpressionEvaluationContext Context(
+ getSema(), EnterExpressionEvaluationContext::InitList,
+ E->isListInitialization());
+ if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args,
+ &ArgumentChanged))
+ return ExprError();
+ }
if (!getDerived().AlwaysRebuild() &&
T == E->getTypeSourceInfo() &&
OpenPOWER on IntegriCloud