From 463e523ad82b465164000fc5e6582191a67408e7 Mon Sep 17 00:00:00 2001 From: Eli Friedman Date: Tue, 22 Dec 2009 02:10:53 +0000 Subject: Switch file-scope assignment initialization over to InitializationSequence. llvm-svn: 91881 --- clang/lib/Sema/SemaDecl.cpp | 29 ++++++++++++++++------------- clang/lib/Sema/SemaInit.cpp | 6 +++++- 2 files changed, 21 insertions(+), 14 deletions(-) (limited to 'clang/lib/Sema') diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index a1792651302..f62d0aa6f9b 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -3557,22 +3557,16 @@ void Sema::AddInitializerToDecl(DeclPtrTy dcl, ExprArg init, bool DirectInit) { VDecl->setInvalidDecl(); } else if (!VDecl->isInvalidDecl()) { InitializationSequence InitSeq(*this, Entity, Kind, &Init, 1); - if (InitSeq) { - OwningExprResult Result = InitSeq.Perform(*this, Entity, Kind, + OwningExprResult Result = InitSeq.Perform(*this, Entity, Kind, MultiExprArg(*this, (void**)&Init, 1), - &DclT); - if (Result.isInvalid()) { - VDecl->setInvalidDecl(); - return; - } - - Init = Result.takeAs(); - } else { - InitSeq.Diagnose(*this, Entity, Kind, &Init, 1); + &DclT); + if (Result.isInvalid()) { VDecl->setInvalidDecl(); return; } + Init = Result.takeAs(); + // C++ 3.6.2p2, allow dynamic initialization of static initializers. // Don't check invalid declarations to avoid emitting useless diagnostics. if (!getLangOptions().CPlusPlus && !VDecl->isInvalidDecl()) { @@ -3630,9 +3624,18 @@ void Sema::AddInitializerToDecl(DeclPtrTy dcl, ExprArg init, bool DirectInit) { } else if (VDecl->isFileVarDecl()) { if (VDecl->getStorageClass() == VarDecl::Extern) Diag(VDecl->getLocation(), diag::warn_extern_init); - if (!VDecl->isInvalidDecl()) - if (CheckInitializerTypes(Init, DclT, Entity, Kind)) + if (!VDecl->isInvalidDecl()) { + InitializationSequence InitSeq(*this, Entity, Kind, &Init, 1); + OwningExprResult Result = InitSeq.Perform(*this, Entity, Kind, + MultiExprArg(*this, (void**)&Init, 1), + &DclT); + if (Result.isInvalid()) { VDecl->setInvalidDecl(); + return; + } + + Init = Result.takeAs(); + } // C++ 3.6.2p2, allow dynamic initialization of static initializers. // Don't check invalid declarations to avoid emitting useless diagnostics. diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp index 3ff25883565..c7a2769c448 100644 --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -3201,8 +3201,12 @@ InitializationSequence::Perform(Sema &S, return S.Owned((Expr *)0); QualType DestType = Entity.getType().getType().getNonReferenceType(); + // FIXME: Ugly hack around the fact that Entity.getType().getType() is not + // the same as Entity.getDecl()->getType() in cases involving type merging, + // and we want latter when it makes sense. if (ResultType) - *ResultType = Entity.getType().getType(); + *ResultType = Entity.getDecl() ? Entity.getDecl()->getType() : + Entity.getType().getType(); Sema::OwningExprResult CurInit = S.Owned((Expr *)0); -- cgit v1.2.3