From 2078bb9c9336da56ea521e98e718556b227541f6 Mon Sep 17 00:00:00 2001 From: Anders Carlsson Date: Wed, 27 May 2009 16:10:08 +0000 Subject: [PATCH] Create CXXConstructExprs when constructing via copy initialization. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@72474 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/Sema.h | 5 ++++- lib/Sema/SemaDecl.cpp | 2 +- lib/Sema/SemaInit.cpp | 12 ++++++++++-- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/lib/Sema/Sema.h b/lib/Sema/Sema.h index 3014a8e2ea..5b3ea40b06 100644 --- a/lib/Sema/Sema.h +++ b/lib/Sema/Sema.h @@ -2630,9 +2630,12 @@ public: IdentifierInfo &Comp, SourceLocation CmpLoc); /// type checking declaration initializers (C99 6.7.8) + + /// FIXME: The VarDecl parameter should not have a default value, + /// and all call sites should be audited. bool CheckInitializerTypes(Expr *&simpleInit_or_initList, QualType &declType, SourceLocation InitLoc,DeclarationName InitEntity, - bool DirectInit); + bool DirectInit, VarDecl *VD = 0); bool CheckInitList(InitListExpr *&InitList, QualType &DeclType); bool CheckForConstantInitializer(Expr *e, QualType t); diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 4149fa4c9a..5e09851770 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -2562,7 +2562,7 @@ void Sema::AddInitializerToDecl(DeclPtrTy dcl, ExprArg init, bool DirectInit) { VDecl->setInvalidDecl(); } else if (!VDecl->isInvalidDecl()) { if (CheckInitializerTypes(Init, DclT, VDecl->getLocation(), - VDecl->getDeclName(), DirectInit)) + VDecl->getDeclName(), DirectInit, VDecl)) VDecl->setInvalidDecl(); // C++ 3.6.2p2, allow dynamic initialization of static initializers. diff --git a/lib/Sema/SemaInit.cpp b/lib/Sema/SemaInit.cpp index d880c236d2..3fae86d19d 100644 --- a/lib/Sema/SemaInit.cpp +++ b/lib/Sema/SemaInit.cpp @@ -18,6 +18,7 @@ #include "Sema.h" #include "clang/Parse/Designator.h" #include "clang/AST/ASTContext.h" +#include "clang/AST/ExprCXX.h" #include "clang/AST/ExprObjC.h" #include using namespace clang; @@ -116,7 +117,7 @@ static void CheckStringInit(Expr *Str, QualType &DeclT, Sema &S) { bool Sema::CheckInitializerTypes(Expr *&Init, QualType &DeclType, SourceLocation InitLoc, DeclarationName InitEntity, - bool DirectInit) { + bool DirectInit, VarDecl *VD) { if (DeclType->isDependentType() || Init->isTypeDependent() || Init->isValueDependent()) return false; @@ -160,7 +161,14 @@ bool Sema::CheckInitializerTypes(Expr *&Init, QualType &DeclType, InitLoc, Init->getSourceRange(), InitEntity, DirectInit? IK_Direct : IK_Copy); - return Constructor == 0; + if (!Constructor) + return true; + + // FIXME: What do do if VD is null here? + assert(VD && "Must have a var decl to construct into!"); + Init = CXXConstructExpr::Create(Context, VD, DeclType, Constructor, + false, &Init, 1); + return false; } // -- Otherwise (i.e., for the remaining copy-initialization -- 2.40.0