forked from OSchip/llvm-project
Revert r130912 in order to approach defaulted functions from the other
direction and not introduce things in the wrong place three different times. llvm-svn: 130968
This commit is contained in:
parent
a7028848a1
commit
58dad7d978
|
@ -1501,9 +1501,6 @@ class CXXConstructorDecl : public CXXMethodDecl {
|
|||
/// @c !Implicit && ImplicitlyDefined.
|
||||
bool ImplicitlyDefined : 1;
|
||||
|
||||
/// IsDefaulted - Whether this constructor was explicitly defaulted
|
||||
bool ExplicitlyDefaulted : 1;
|
||||
|
||||
/// Support for base and member initializers.
|
||||
/// CtorInitializers - The arguments used to initialize the base
|
||||
/// or member.
|
||||
|
@ -1514,13 +1511,11 @@ class CXXConstructorDecl : public CXXMethodDecl {
|
|||
const DeclarationNameInfo &NameInfo,
|
||||
QualType T, TypeSourceInfo *TInfo,
|
||||
bool isExplicitSpecified, bool isInline,
|
||||
bool isImplicitlyDeclared, bool isExplicitlyDefaulted)
|
||||
bool isImplicitlyDeclared)
|
||||
: CXXMethodDecl(CXXConstructor, RD, StartLoc, NameInfo, T, TInfo, false,
|
||||
SC_None, isInline, SourceLocation()),
|
||||
IsExplicitSpecified(isExplicitSpecified), ImplicitlyDefined(false),
|
||||
ExplicitlyDefaulted(isExplicitlyDefaulted),
|
||||
CtorInitializers(0), NumCtorInitializers(0)
|
||||
{
|
||||
CtorInitializers(0), NumCtorInitializers(0) {
|
||||
setImplicit(isImplicitlyDeclared);
|
||||
}
|
||||
|
||||
|
@ -1531,8 +1526,7 @@ public:
|
|||
const DeclarationNameInfo &NameInfo,
|
||||
QualType T, TypeSourceInfo *TInfo,
|
||||
bool isExplicit,
|
||||
bool isInline, bool isImplicitlyDeclared,
|
||||
bool isExplicitlyDefaulted);
|
||||
bool isInline, bool isImplicitlyDeclared);
|
||||
|
||||
/// isExplicitSpecified - Whether this constructor declaration has the
|
||||
/// 'explicit' keyword specified.
|
||||
|
@ -1564,28 +1558,6 @@ public:
|
|||
ImplicitlyDefined = ID;
|
||||
}
|
||||
|
||||
/// isExplicitlyDefaulted - Whether this constructor was explicitly defaulted.
|
||||
bool isExplicitlyDefaulted() const {
|
||||
return ExplicitlyDefaulted;
|
||||
}
|
||||
/// setExplicitlyDefaulted - Set whether this contructor was explicitly
|
||||
/// defaulted or not.
|
||||
void setExplicitlyDefaulted(bool B) {
|
||||
ExplicitlyDefaulted = B;
|
||||
}
|
||||
|
||||
/// isDefaulted - True if this was either explicitly defaulted or is implicit
|
||||
bool isDefaulted() const {
|
||||
return ExplicitlyDefaulted || isImplicit();
|
||||
}
|
||||
|
||||
/// isUserProvided - True if this function was neither defaulted nor deleted
|
||||
/// on its first declaration.
|
||||
bool isUserProvided() const {
|
||||
const CXXConstructorDecl *Canonical = getCanonicalDecl();
|
||||
return !Canonical->isDefaulted() && !Canonical->isDeleted();
|
||||
}
|
||||
|
||||
/// init_iterator - Iterates through the member/base initializer list.
|
||||
typedef CXXCtorInitializer **init_iterator;
|
||||
|
||||
|
|
|
@ -52,10 +52,6 @@ def err_invalid_storage_class_in_func_decl : Error<
|
|||
def err_expected_namespace_name : Error<"expected namespace name">;
|
||||
def ext_variadic_templates : ExtWarn<
|
||||
"variadic templates are a C++0x extension">, InGroup<CXX0x>;
|
||||
def err_default_special_members : Error<
|
||||
"Only special member functions may be defaulted">;
|
||||
def err_friends_define_only_namespace_scope : Error<
|
||||
"Cannot define a function with non-namespace scope in a friend declaration">;
|
||||
|
||||
// Sema && Lex
|
||||
def ext_longlong : Extension<
|
||||
|
|
|
@ -434,9 +434,6 @@ def err_missing_whitespace_digraph : Error<
|
|||
|
||||
def warn_deleted_function_accepted_as_extension: ExtWarn<
|
||||
"deleted function definition accepted as a C++0x extension">, InGroup<CXX0x>;
|
||||
def warn_defaulted_function_accepted_as_extension: ExtWarn<
|
||||
"defaulted function definition accepted as a C++0x extension">,
|
||||
InGroup<CXX0x>;
|
||||
|
||||
// C++0x alias-declaration
|
||||
def ext_alias_declaration : ExtWarn<
|
||||
|
|
|
@ -3063,7 +3063,7 @@ public:
|
|||
MultiTemplateParamsArg TemplateParameterLists,
|
||||
Expr *BitfieldWidth, const VirtSpecifiers &VS,
|
||||
Expr *Init, bool IsDefinition,
|
||||
bool Deleted = false, bool Defaulted = false);
|
||||
bool Deleted = false);
|
||||
|
||||
MemInitResult ActOnMemInitializer(Decl *ConstructorD,
|
||||
Scope *S,
|
||||
|
|
|
@ -2397,8 +2397,7 @@ Decl *ASTNodeImporter::VisitFunctionDecl(FunctionDecl *D) {
|
|||
NameInfo, T, TInfo,
|
||||
FromConstructor->isExplicit(),
|
||||
D->isInlineSpecified(),
|
||||
D->isImplicit(),
|
||||
FromConstructor->isExplicitlyDefaulted());
|
||||
D->isImplicit());
|
||||
} else if (isa<CXXDestructorDecl>(D)) {
|
||||
ToFunction = CXXDestructorDecl::Create(Importer.getToContext(),
|
||||
cast<CXXRecordDecl>(DC),
|
||||
|
|
|
@ -1301,7 +1301,7 @@ SourceRange CXXCtorInitializer::getSourceRange() const {
|
|||
CXXConstructorDecl *
|
||||
CXXConstructorDecl::Create(ASTContext &C, EmptyShell Empty) {
|
||||
return new (C) CXXConstructorDecl(0, SourceLocation(), DeclarationNameInfo(),
|
||||
QualType(), 0, false, false, false, false);
|
||||
QualType(), 0, false, false, false);
|
||||
}
|
||||
|
||||
CXXConstructorDecl *
|
||||
|
@ -1311,14 +1311,12 @@ CXXConstructorDecl::Create(ASTContext &C, CXXRecordDecl *RD,
|
|||
QualType T, TypeSourceInfo *TInfo,
|
||||
bool isExplicit,
|
||||
bool isInline,
|
||||
bool isImplicitlyDeclared,
|
||||
bool isExplicitlyDefaulted) {
|
||||
bool isImplicitlyDeclared) {
|
||||
assert(NameInfo.getName().getNameKind()
|
||||
== DeclarationName::CXXConstructorName &&
|
||||
"Name must refer to a constructor");
|
||||
return new (C) CXXConstructorDecl(RD, StartLoc, NameInfo, T, TInfo,
|
||||
isExplicit, isInline, isImplicitlyDeclared,
|
||||
isExplicitlyDefaulted);
|
||||
isExplicit, isInline, isImplicitlyDeclared);
|
||||
}
|
||||
|
||||
bool CXXConstructorDecl::isDefaultConstructor() const {
|
||||
|
|
|
@ -966,11 +966,6 @@ Decl *Parser::ParseDeclarationAfterDeclaratorAndAttributes(Declarator &D,
|
|||
Diag(DelLoc, diag::warn_deleted_function_accepted_as_extension);
|
||||
|
||||
Actions.SetDeclDeleted(ThisDecl, DelLoc);
|
||||
} else if (Tok.is(tok::kw_default)) {
|
||||
SourceLocation DefLoc = ConsumeToken();
|
||||
Diag(DefLoc, diag::err_default_special_members);
|
||||
|
||||
ThisDecl->setInvalidDecl();
|
||||
} else {
|
||||
if (getLang().CPlusPlus && D.getCXXScopeSpec().isSet()) {
|
||||
EnterScope(0);
|
||||
|
|
|
@ -1648,8 +1648,6 @@ void Parser::ParseCXXClassMemberDeclaration(AccessSpecifier AS,
|
|||
ExprResult BitfieldSize;
|
||||
ExprResult Init;
|
||||
bool Deleted = false;
|
||||
bool Defaulted = false;
|
||||
SourceLocation DefLoc;
|
||||
|
||||
while (1) {
|
||||
// member-declarator:
|
||||
|
@ -1681,11 +1679,6 @@ void Parser::ParseCXXClassMemberDeclaration(AccessSpecifier AS,
|
|||
Diag(Tok, diag::warn_deleted_function_accepted_as_extension);
|
||||
ConsumeToken();
|
||||
Deleted = true;
|
||||
} else if (Tok.is(tok::kw_delete)) {
|
||||
if (!getLang().CPlusPlus0x)
|
||||
Diag(Tok, diag::warn_defaulted_function_accepted_as_extension);
|
||||
DefLoc = ConsumeToken();
|
||||
Defaulted = true;
|
||||
} else {
|
||||
Init = ParseInitializer();
|
||||
if (Init.isInvalid())
|
||||
|
@ -1717,10 +1710,6 @@ void Parser::ParseCXXClassMemberDeclaration(AccessSpecifier AS,
|
|||
ThisDecl = Actions.ActOnFriendFunctionDecl(getCurScope(), DeclaratorInfo,
|
||||
/*IsDefinition*/ false,
|
||||
move(TemplateParams));
|
||||
if (Defaulted) {
|
||||
Diag(DefLoc, diag::err_friends_define_only_namespace_scope);
|
||||
ThisDecl->setInvalidDecl();
|
||||
}
|
||||
} else {
|
||||
ThisDecl = Actions.ActOnCXXMemberDeclarator(getCurScope(), AS,
|
||||
DeclaratorInfo,
|
||||
|
@ -1728,7 +1717,7 @@ void Parser::ParseCXXClassMemberDeclaration(AccessSpecifier AS,
|
|||
BitfieldSize.release(),
|
||||
VS, Init.release(),
|
||||
/*IsDefinition*/Deleted,
|
||||
Deleted, Defaulted);
|
||||
Deleted);
|
||||
}
|
||||
if (ThisDecl)
|
||||
DeclsInGroup.push_back(ThisDecl);
|
||||
|
@ -1755,7 +1744,6 @@ void Parser::ParseCXXClassMemberDeclaration(AccessSpecifier AS,
|
|||
BitfieldSize = 0;
|
||||
Init = 0;
|
||||
Deleted = false;
|
||||
Defaulted = false;
|
||||
|
||||
// Attributes are only allowed on the second declarator.
|
||||
MaybeParseGNUAttributes(DeclaratorInfo);
|
||||
|
|
|
@ -4109,8 +4109,7 @@ Sema::ActOnFunctionDeclarator(Scope* S, Declarator& D, DeclContext* DC,
|
|||
D.getSourceRange().getBegin(),
|
||||
NameInfo, R, TInfo,
|
||||
isExplicit, isInline,
|
||||
/*isImplicitlyDeclared=*/false,
|
||||
/*isExplicitlyDefaulted=*/false);
|
||||
/*isImplicitlyDeclared=*/false);
|
||||
} else if (Name.getNameKind() == DeclarationName::CXXDestructorName) {
|
||||
// This is a C++ destructor declaration.
|
||||
if (DC->isRecord()) {
|
||||
|
|
|
@ -963,10 +963,7 @@ Sema::ActOnCXXMemberDeclarator(Scope *S, AccessSpecifier AS, Declarator &D,
|
|||
MultiTemplateParamsArg TemplateParameterLists,
|
||||
ExprTy *BW, const VirtSpecifiers &VS,
|
||||
ExprTy *InitExpr, bool IsDefinition,
|
||||
bool Deleted, bool Defaulted) {
|
||||
// FIXME: Do something with this
|
||||
(void) Defaulted;
|
||||
|
||||
bool Deleted) {
|
||||
const DeclSpec &DS = D.getDeclSpec();
|
||||
DeclarationNameInfo NameInfo = GetNameForDeclarator(D);
|
||||
DeclarationName Name = NameInfo.getName();
|
||||
|
@ -5051,8 +5048,7 @@ CXXConstructorDecl *Sema::DeclareImplicitDefaultConstructor(
|
|||
/*TInfo=*/0,
|
||||
/*isExplicit=*/false,
|
||||
/*isInline=*/true,
|
||||
/*isImplicitlyDeclared=*/true,
|
||||
/*isExplicitlyDefaulted=*/false);
|
||||
/*isImplicitlyDeclared=*/true);
|
||||
DefaultCon->setAccess(AS_public);
|
||||
DefaultCon->setImplicit();
|
||||
DefaultCon->setTrivial(ClassDecl->hasTrivialConstructor());
|
||||
|
@ -5248,8 +5244,7 @@ void Sema::DeclareInheritedConstructors(CXXRecordDecl *ClassDecl) {
|
|||
CXXConstructorDecl *NewCtor = CXXConstructorDecl::Create(
|
||||
Context, ClassDecl, UsingLoc, DNI, QualType(NewCtorType, 0),
|
||||
/*TInfo=*/0, BaseCtor->isExplicit(), /*Inline=*/true,
|
||||
/*ImplicitlyDeclared=*/true,
|
||||
/*isExplicitlyDefaulted*/false);
|
||||
/*ImplicitlyDeclared=*/true);
|
||||
NewCtor->setAccess(BaseCtor->getAccess());
|
||||
|
||||
// Build up the parameter decls and add them.
|
||||
|
@ -6198,8 +6193,7 @@ CXXConstructorDecl *Sema::DeclareImplicitCopyConstructor(
|
|||
/*TInfo=*/0,
|
||||
/*isExplicit=*/false,
|
||||
/*isInline=*/true,
|
||||
/*isImplicitlyDeclared=*/true,
|
||||
/*isExplicitlyDefaulted=*/false);
|
||||
/*isImplicitlyDeclared=*/true);
|
||||
CopyConstructor->setAccess(AS_public);
|
||||
CopyConstructor->setTrivial(ClassDecl->hasTrivialCopyConstructor());
|
||||
|
||||
|
|
|
@ -1375,8 +1375,7 @@ TemplateDeclInstantiator::VisitCXXMethodDecl(CXXMethodDecl *D,
|
|||
StartLoc, NameInfo, T, TInfo,
|
||||
Constructor->isExplicit(),
|
||||
Constructor->isInlineSpecified(),
|
||||
false,
|
||||
Constructor->isExplicitlyDefaulted());
|
||||
false);
|
||||
} else if (CXXDestructorDecl *Destructor = dyn_cast<CXXDestructorDecl>(D)) {
|
||||
Method = CXXDestructorDecl::Create(SemaRef.Context, Record,
|
||||
StartLoc, NameInfo, T, TInfo,
|
||||
|
|
Loading…
Reference in New Issue