зеркало из https://github.com/microsoft/clang-1.git
Create CXXConstructExprs when constructing via copy initialization.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@72474 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
50c39ea485
Коммит
2078bb9c93
|
@ -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);
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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 <map>
|
||||
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
|
||||
|
|
Загрузка…
Ссылка в новой задаче