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.
|
/// constructed variable.
|
||||||
void FinalizeVarWithDestructor(VarDecl *VD, const RecordType *DeclInitType);
|
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
|
/// DefineImplicitDefaultConstructor - Checks for feasibility of
|
||||||
/// defining this constructor as the default constructor.
|
/// defining this constructor as the default constructor.
|
||||||
void DefineImplicitDefaultConstructor(SourceLocation CurrentLocation,
|
void DefineImplicitDefaultConstructor(SourceLocation CurrentLocation,
|
||||||
|
|
|
@ -2656,41 +2656,11 @@ namespace {
|
||||||
/// The scope, if provided, is the class scope.
|
/// The scope, if provided, is the class scope.
|
||||||
void Sema::AddImplicitlyDeclaredMembersToClass(Scope *S,
|
void Sema::AddImplicitlyDeclaredMembersToClass(Scope *S,
|
||||||
CXXRecordDecl *ClassDecl) {
|
CXXRecordDecl *ClassDecl) {
|
||||||
CanQualType ClassType
|
|
||||||
= Context.getCanonicalType(Context.getTypeDeclType(ClassDecl));
|
|
||||||
|
|
||||||
// FIXME: Implicit declarations have exception specifications, which are
|
// FIXME: Implicit declarations have exception specifications, which are
|
||||||
// the union of the specifications of the implicitly called functions.
|
// the union of the specifications of the implicitly called functions.
|
||||||
|
|
||||||
if (!ClassDecl->hasUserDeclaredConstructor()) {
|
if (!ClassDecl->hasUserDeclaredConstructor())
|
||||||
// C++ [class.ctor]p5:
|
DeclareImplicitDefaultConstructor(S, ClassDecl);
|
||||||
// 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->hasUserDeclaredCopyConstructor())
|
if (!ClassDecl->hasUserDeclaredCopyConstructor())
|
||||||
DeclareImplicitCopyConstructor(S, ClassDecl);
|
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,
|
void Sema::DefineImplicitDefaultConstructor(SourceLocation CurrentLocation,
|
||||||
CXXConstructorDecl *Constructor) {
|
CXXConstructorDecl *Constructor) {
|
||||||
assert((Constructor->isImplicit() && Constructor->isDefaultConstructor() &&
|
assert((Constructor->isImplicit() && Constructor->isDefaultConstructor() &&
|
||||||
|
|
Loading…
Reference in New Issue