forked from OSchip/llvm-project
Move the implicit declaration of a default constructor into a separate
routine; no functionality change. llvm-svn: 107434
This commit is contained in:
parent
03bcd6ecc8
commit
4e8b5fb1eb
|
@ -2220,6 +2220,18 @@ public:
|
|||
/// constructed variable.
|
||||
void FinalizeVarWithDestructor(VarDecl *VD, const RecordType *DeclInitType);
|
||||
|
||||
/// \brief Declare the implicit default constructor for the given class.
|
||||
///
|
||||
/// \param S The scope of the class, which may be NULL if this is a
|
||||
/// template instantiation.
|
||||
///
|
||||
/// \param ClassDecl The class declaration into which the implicit
|
||||
/// default constructor will be added.
|
||||
///
|
||||
/// \returns The implicitly-declared default constructor.
|
||||
CXXConstructorDecl *DeclareImplicitDefaultConstructor(Scope *S,
|
||||
CXXRecordDecl *ClassDecl);
|
||||
|
||||
/// DefineImplicitDefaultConstructor - Checks for feasibility of
|
||||
/// defining this constructor as the default constructor.
|
||||
void DefineImplicitDefaultConstructor(SourceLocation CurrentLocation,
|
||||
|
|
|
@ -2656,41 +2656,11 @@ namespace {
|
|||
/// The scope, if provided, is the class scope.
|
||||
void Sema::AddImplicitlyDeclaredMembersToClass(Scope *S,
|
||||
CXXRecordDecl *ClassDecl) {
|
||||
CanQualType ClassType
|
||||
= Context.getCanonicalType(Context.getTypeDeclType(ClassDecl));
|
||||
|
||||
// FIXME: Implicit declarations have exception specifications, which are
|
||||
// the union of the specifications of the implicitly called functions.
|
||||
|
||||
if (!ClassDecl->hasUserDeclaredConstructor()) {
|
||||
// C++ [class.ctor]p5:
|
||||
// A default constructor for a class X is a constructor of class X
|
||||
// that can be called without an argument. If there is no
|
||||
// user-declared constructor for class X, a default constructor is
|
||||
// implicitly declared. An implicitly-declared default constructor
|
||||
// is an inline public member of its class.
|
||||
DeclarationName Name
|
||||
= Context.DeclarationNames.getCXXConstructorName(ClassType);
|
||||
CXXConstructorDecl *DefaultCon =
|
||||
CXXConstructorDecl::Create(Context, ClassDecl,
|
||||
ClassDecl->getLocation(), Name,
|
||||
Context.getFunctionType(Context.VoidTy,
|
||||
0, 0, false, 0,
|
||||
/*FIXME*/false, false,
|
||||
0, 0,
|
||||
FunctionType::ExtInfo()),
|
||||
/*TInfo=*/0,
|
||||
/*isExplicit=*/false,
|
||||
/*isInline=*/true,
|
||||
/*isImplicitlyDeclared=*/true);
|
||||
DefaultCon->setAccess(AS_public);
|
||||
DefaultCon->setImplicit();
|
||||
DefaultCon->setTrivial(ClassDecl->hasTrivialConstructor());
|
||||
if (S)
|
||||
PushOnScopeChains(DefaultCon, S, true);
|
||||
else
|
||||
ClassDecl->addDecl(DefaultCon);
|
||||
}
|
||||
if (!ClassDecl->hasUserDeclaredConstructor())
|
||||
DeclareImplicitDefaultConstructor(S, ClassDecl);
|
||||
|
||||
if (!ClassDecl->hasUserDeclaredCopyConstructor())
|
||||
DeclareImplicitCopyConstructor(S, ClassDecl);
|
||||
|
@ -4168,6 +4138,40 @@ namespace {
|
|||
};
|
||||
}
|
||||
|
||||
CXXConstructorDecl *Sema::DeclareImplicitDefaultConstructor(Scope *S,
|
||||
CXXRecordDecl *ClassDecl) {
|
||||
// C++ [class.ctor]p5:
|
||||
// A default constructor for a class X is a constructor of class X
|
||||
// that can be called without an argument. If there is no
|
||||
// user-declared constructor for class X, a default constructor is
|
||||
// implicitly declared. An implicitly-declared default constructor
|
||||
// is an inline public member of its class.
|
||||
CanQualType ClassType
|
||||
= Context.getCanonicalType(Context.getTypeDeclType(ClassDecl));
|
||||
DeclarationName Name
|
||||
= Context.DeclarationNames.getCXXConstructorName(ClassType);
|
||||
CXXConstructorDecl *DefaultCon
|
||||
= CXXConstructorDecl::Create(Context, ClassDecl,
|
||||
ClassDecl->getLocation(), Name,
|
||||
Context.getFunctionType(Context.VoidTy,
|
||||
0, 0, false, 0,
|
||||
/*FIXME*/false, false,
|
||||
0, 0,
|
||||
FunctionType::ExtInfo()),
|
||||
/*TInfo=*/0,
|
||||
/*isExplicit=*/false,
|
||||
/*isInline=*/true,
|
||||
/*isImplicitlyDeclared=*/true);
|
||||
DefaultCon->setAccess(AS_public);
|
||||
DefaultCon->setImplicit();
|
||||
DefaultCon->setTrivial(ClassDecl->hasTrivialConstructor());
|
||||
if (S)
|
||||
PushOnScopeChains(DefaultCon, S, true);
|
||||
else
|
||||
ClassDecl->addDecl(DefaultCon);
|
||||
return DefaultCon;
|
||||
}
|
||||
|
||||
void Sema::DefineImplicitDefaultConstructor(SourceLocation CurrentLocation,
|
||||
CXXConstructorDecl *Constructor) {
|
||||
assert((Constructor->isImplicit() && Constructor->isDefaultConstructor() &&
|
||||
|
|
Loading…
Reference in New Issue