From: Richard Smith Date: Fri, 6 Dec 2013 01:27:24 +0000 (+0000) Subject: PR18152: When computing the semantic form for an initializer list, keep track X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7509ea64dfb1ed4fa4073db6c3f6685b44758bf6;p=clang PR18152: When computing the semantic form for an initializer list, keep track of whether the initializer list is dependent. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@196558 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/Expr.h b/include/clang/AST/Expr.h index f2648b9a4a..197fe51e30 100644 --- a/include/clang/AST/Expr.h +++ b/include/clang/AST/Expr.h @@ -3774,6 +3774,14 @@ public: void setInit(unsigned Init, Expr *expr) { assert(Init < getNumInits() && "Initializer access out of range!"); InitExprs[Init] = expr; + + if (expr) { + ExprBits.TypeDependent |= expr->isTypeDependent(); + ExprBits.ValueDependent |= expr->isValueDependent(); + ExprBits.InstantiationDependent |= expr->isInstantiationDependent(); + ExprBits.ContainsUnexpandedParameterPack |= + expr->containsUnexpandedParameterPack(); + } } /// \brief Reserve space for some number of initializers. diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp index 9055ddac35..d98d0a537e 100644 --- a/lib/AST/Expr.cpp +++ b/lib/AST/Expr.cpp @@ -1867,12 +1867,12 @@ void InitListExpr::resizeInits(const ASTContext &C, unsigned NumInits) { Expr *InitListExpr::updateInit(const ASTContext &C, unsigned Init, Expr *expr) { if (Init >= InitExprs.size()) { InitExprs.insert(C, InitExprs.end(), Init - InitExprs.size() + 1, 0); - InitExprs.back() = expr; + setInit(Init, expr); return 0; } Expr *Result = cast_or_null(InitExprs[Init]); - InitExprs[Init] = expr; + setInit(Init, expr); return Result; } diff --git a/test/SemaTemplate/dependent-expr.cpp b/test/SemaTemplate/dependent-expr.cpp index 2c26ec53a0..7195c9d48d 100644 --- a/test/SemaTemplate/dependent-expr.cpp +++ b/test/SemaTemplate/dependent-expr.cpp @@ -93,3 +93,10 @@ namespace PR10837 { } template struct A; } + +namespace PR18152 { + template struct A { + static const int n = {N}; + }; + template struct A<0>; +}