From: Sebastian Redl Date: Tue, 24 Nov 2009 23:38:44 +0000 (+0000) Subject: Have the parser tell sema whether a member declaration is a function definition.... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d1a7846699a82f85ff3ce6b2e383409537c3f5c5;p=clang Have the parser tell sema whether a member declaration is a function definition. This allows sema to not emit spurious diagnostics in some invalid code. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@89816 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Parse/Action.h b/include/clang/Parse/Action.h index de5a82f071..3db90c6574 100644 --- a/include/clang/Parse/Action.h +++ b/include/clang/Parse/Action.h @@ -1481,6 +1481,7 @@ public: MultiTemplateParamsArg TemplateParameterLists, ExprTy *BitfieldWidth, ExprTy *Init, + bool IsDefinition, bool Deleted = false) { return DeclPtrTy(); } diff --git a/lib/Parse/ParseCXXInlineMethods.cpp b/lib/Parse/ParseCXXInlineMethods.cpp index c34653ee42..b9314d2424 100644 --- a/lib/Parse/ParseCXXInlineMethods.cpp +++ b/lib/Parse/ParseCXXInlineMethods.cpp @@ -37,7 +37,8 @@ Parser::ParseCXXInlineMethodDef(AccessSpecifier AS, Declarator &D, FnD = Actions.ActOnFriendFunctionDecl(CurScope, D, true, move(TemplateParams)); else // FIXME: pass template information through FnD = Actions.ActOnCXXMemberDeclarator(CurScope, AS, D, - move(TemplateParams), 0, 0); + move(TemplateParams), 0, 0, + /*IsDefinition*/true); HandleMemberFunctionDefaultArgs(D, FnD); diff --git a/lib/Parse/ParseDeclCXX.cpp b/lib/Parse/ParseDeclCXX.cpp index a21f034427..2a3b5d665c 100644 --- a/lib/Parse/ParseDeclCXX.cpp +++ b/lib/Parse/ParseDeclCXX.cpp @@ -1237,6 +1237,7 @@ void Parser::ParseCXXClassMemberDeclaration(AccessSpecifier AS, move(TemplateParams), BitfieldSize.release(), Init.release(), + /*IsDefinition*/Deleted, Deleted); } if (ThisDecl) diff --git a/lib/Sema/Sema.h b/lib/Sema/Sema.h index 1dda7308e0..feff59a026 100644 --- a/lib/Sema/Sema.h +++ b/lib/Sema/Sema.h @@ -2041,7 +2041,7 @@ public: Declarator &D, MultiTemplateParamsArg TemplateParameterLists, ExprTy *BitfieldWidth, - ExprTy *Init, + ExprTy *Init, bool IsDefinition, bool Deleted = false); virtual MemInitResult ActOnMemInitializer(DeclPtrTy ConstructorD, diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index 797dbf5fe2..b5419c1c90 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -790,7 +790,8 @@ std::string Sema::getAmbiguousPathsDisplayString(CXXBasePaths &Paths) { Sema::DeclPtrTy Sema::ActOnCXXMemberDeclarator(Scope *S, AccessSpecifier AS, Declarator &D, MultiTemplateParamsArg TemplateParameterLists, - ExprTy *BW, ExprTy *InitExpr, bool Deleted) { + ExprTy *BW, ExprTy *InitExpr, bool IsDefinition, + bool Deleted) { const DeclSpec &DS = D.getDeclSpec(); DeclarationName Name = GetNameForDeclarator(D); Expr *BitWidth = static_cast(BW); @@ -872,7 +873,7 @@ Sema::ActOnCXXMemberDeclarator(Scope *S, AccessSpecifier AS, Declarator &D, AS); assert(Member && "HandleField never returns null"); } else { - Member = HandleDeclarator(S, D, move(TemplateParameterLists), false) + Member = HandleDeclarator(S, D, move(TemplateParameterLists), IsDefinition) .getAs(); if (!Member) { if (BitWidth) DeleteExpr(BitWidth); diff --git a/test/SemaCXX/class.cpp b/test/SemaCXX/class.cpp index 302d1d58d3..2637f32020 100644 --- a/test/SemaCXX/class.cpp +++ b/test/SemaCXX/class.cpp @@ -114,8 +114,7 @@ struct C4 { // PR5415 - don't hang! struct S { - void f(); // expected-note 2 {{previous declaration}} - // FIXME: the out-of-line error shouldn't be there - void S::f() {} // expected-error {{class member cannot be redeclared}} expected-error {{out-of-line}} expected-note {{previous definition}} + void f(); // expected-note 1 {{previous declaration}} + void S::f() {} // expected-error {{class member cannot be redeclared}} expected-note {{previous declaration}} expected-note {{previous definition}} void f() {} // expected-error {{class member cannot be redeclared}} expected-error {{redefinition}} };