From: Sean Hunt Date: Fri, 6 May 2011 00:11:07 +0000 (+0000) Subject: Revert r130912 in order to approach defaulted functions from the other X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5f802e51406664ca9b6e0d57fc7ce37ea97a1c65;p=clang Revert r130912 in order to approach defaulted functions from the other direction and not introduce things in the wrong place three different times. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@130968 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/DeclCXX.h b/include/clang/AST/DeclCXX.h index f5026f5c4b..88f473eb48 100644 --- a/include/clang/AST/DeclCXX.h +++ b/include/clang/AST/DeclCXX.h @@ -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; diff --git a/include/clang/Basic/DiagnosticCommonKinds.td b/include/clang/Basic/DiagnosticCommonKinds.td index 166f81a5ff..0b0bca0395 100644 --- a/include/clang/Basic/DiagnosticCommonKinds.td +++ b/include/clang/Basic/DiagnosticCommonKinds.td @@ -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; -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< diff --git a/include/clang/Basic/DiagnosticParseKinds.td b/include/clang/Basic/DiagnosticParseKinds.td index 3a8a708afa..e2d7f4ce9a 100644 --- a/include/clang/Basic/DiagnosticParseKinds.td +++ b/include/clang/Basic/DiagnosticParseKinds.td @@ -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; -def warn_defaulted_function_accepted_as_extension: ExtWarn< - "defaulted function definition accepted as a C++0x extension">, - InGroup; // C++0x alias-declaration def ext_alias_declaration : ExtWarn< diff --git a/include/clang/Sema/Sema.h b/include/clang/Sema/Sema.h index 4f8a61570e..69e14f3c0b 100644 --- a/include/clang/Sema/Sema.h +++ b/include/clang/Sema/Sema.h @@ -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, diff --git a/lib/AST/ASTImporter.cpp b/lib/AST/ASTImporter.cpp index 8e95cfecf4..dc881ba869 100644 --- a/lib/AST/ASTImporter.cpp +++ b/lib/AST/ASTImporter.cpp @@ -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(D)) { ToFunction = CXXDestructorDecl::Create(Importer.getToContext(), cast(DC), diff --git a/lib/AST/DeclCXX.cpp b/lib/AST/DeclCXX.cpp index ce2d811929..9099cd524f 100644 --- a/lib/AST/DeclCXX.cpp +++ b/lib/AST/DeclCXX.cpp @@ -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 { diff --git a/lib/Parse/ParseDecl.cpp b/lib/Parse/ParseDecl.cpp index 1eaae678e2..a20e90bd0e 100644 --- a/lib/Parse/ParseDecl.cpp +++ b/lib/Parse/ParseDecl.cpp @@ -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); diff --git a/lib/Parse/ParseDeclCXX.cpp b/lib/Parse/ParseDeclCXX.cpp index 9c464bc248..7247c0724e 100644 --- a/lib/Parse/ParseDeclCXX.cpp +++ b/lib/Parse/ParseDeclCXX.cpp @@ -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); diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 7845247a24..2a63c91135 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -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()) { diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index 6dad78442d..525cb81c80 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -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()); diff --git a/lib/Sema/SemaTemplateInstantiateDecl.cpp b/lib/Sema/SemaTemplateInstantiateDecl.cpp index 2c0c7ae90f..f6cbe267b4 100644 --- a/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -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(D)) { Method = CXXDestructorDecl::Create(SemaRef.Context, Record, StartLoc, NameInfo, T, TInfo,