From: Richard Smith Date: Fri, 21 Dec 2012 08:13:35 +0000 (+0000) Subject: Fix regression in r170489: when instantiating a direct initializer which is a X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5cf1589db395371975bd3315b9126eb5c9be6701;p=clang Fix regression in r170489: when instantiating a direct initializer which is a CXXScalarValueInitExpr (or an ImplicitValueInitExpr), strip it back down to an empty pair of parentheses so that the initialization code can tell that we're performing value-initialization. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@170867 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index 7656d9ee66..5436434340 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -4697,7 +4697,6 @@ Sema::MaybeConvertParenListExprToParenExpr(Scope *S, Expr *OrigExpr) { ExprResult Sema::ActOnParenListExpr(SourceLocation L, SourceLocation R, MultiExprArg Val) { - assert(Val.data() != 0 && "ActOnParenOrParenListExpr() missing expr list"); Expr *expr = new (Context) ParenListExpr(Context, L, Val, R); return Owned(expr); } diff --git a/lib/Sema/TreeTransform.h b/lib/Sema/TreeTransform.h index c161d8cfcb..baf2308a45 100644 --- a/lib/Sema/TreeTransform.h +++ b/lib/Sema/TreeTransform.h @@ -2602,12 +2602,28 @@ ExprResult TreeTransform::TransformInitializer(Expr *Init, if (ImplicitCastExpr *ICE = dyn_cast(Init)) Init = ICE->getSubExprAsWritten(); - // If this is a direct-initializer, we take apart CXXConstructExprs. - // Everything else is passed through. - CXXConstructExpr *Construct; - if (!(Construct = dyn_cast(Init)) || - isa(Construct) || - (!CXXDirectInit && !Construct->isListInitialization())) + // If this is not a direct-initializer, we only need to reconstruct + // InitListExprs. Other forms of copy-initialization will be a no-op if + // the initializer is already the right type. + CXXConstructExpr *Construct = dyn_cast(Init); + if (!CXXDirectInit && !(Construct && Construct->isListInitialization())) + return getDerived().TransformExpr(Init); + + // Revert value-initialization back to empty parens. + if (CXXScalarValueInitExpr *VIE = dyn_cast(Init)) { + SourceRange Parens = VIE->getSourceRange(); + return getDerived().RebuildParenListExpr(Parens.getBegin(), MultiExprArg(), + Parens.getEnd()); + } + + // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization. + if (isa(Init)) + return getDerived().RebuildParenListExpr(SourceLocation(), MultiExprArg(), + SourceLocation()); + + // Revert initialization by constructor back to a parenthesized or braced list + // of expressions. Any other form of initializer can just be reused directly. + if (!Construct || isa(Construct)) return getDerived().TransformExpr(Init); SmallVector NewArgs; diff --git a/test/SemaTemplate/instantiate-member-initializers.cpp b/test/SemaTemplate/instantiate-member-initializers.cpp index 297ae917bb..63862063ac 100644 --- a/test/SemaTemplate/instantiate-member-initializers.cpp +++ b/test/SemaTemplate/instantiate-member-initializers.cpp @@ -35,3 +35,9 @@ struct Y { X x; }; Y y; + +template struct Array { + int a[3]; + Array() : a() {} +}; +Array s;