r284802 - Don't try to use !Previous.empty() as a proxy for "Is this a redeclaration?" --
Richard Smith via cfe-commits
cfe-commits at lists.llvm.org
Thu Oct 20 20:15:03 PDT 2016
Author: rsmith
Date: Thu Oct 20 22:15:03 2016
New Revision: 284802
URL: http://llvm.org/viewvc/llvm-project?rev=284802&view=rev
Log:
Don't try to use !Previous.empty() as a proxy for "Is this a redeclaration?" --
we don't collapse that down to a single entry if it's not a redeclaration.
Instead, set the Redeclaration bit on the Declarator to indicate whether a
function is a redeclaration (which may not have been linked into the
redeclaration chain if it's a dependent context friend).
Fixes a rejects-valid; see testcase.
Modified:
cfe/trunk/lib/Sema/SemaDecl.cpp
cfe/trunk/lib/Sema/SemaDeclCXX.cpp
cfe/trunk/test/SemaCXX/friend.cpp
Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=284802&r1=284801&r2=284802&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDecl.cpp Thu Oct 20 22:15:03 2016
@@ -8445,7 +8445,7 @@ Sema::ActOnFunctionDeclarator(Scope *S,
? cast<NamedDecl>(FunctionTemplate)
: NewFD);
- if (isFriend && D.isRedeclaration()) {
+ if (isFriend && NewFD->getPreviousDecl()) {
AccessSpecifier Access = AS_public;
if (!NewFD->isInvalidDecl())
Access = NewFD->getPreviousDecl()->getAccess();
@@ -8901,8 +8901,6 @@ bool Sema::CheckFunctionDeclaration(Scop
NewFD->setPreviousDeclaration(cast<FunctionDecl>(OldDecl));
if (isa<CXXMethodDecl>(NewFD))
NewFD->setAccess(OldDecl->getAccess());
- } else {
- Redeclaration = false;
}
}
}
Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=284802&r1=284801&r2=284802&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Thu Oct 20 22:15:03 2016
@@ -13785,10 +13785,9 @@ NamedDecl *Sema::ActOnFriendFunctionDecl
// template in the translation unit.
if (functionDeclHasDefaultArgument(FD)) {
// We can't look at FD->getPreviousDecl() because it may not have been set
- // if we're in a dependent context. If we get this far with a non-empty
- // Previous set, we must have a valid previous declaration of this
- // function.
- if (!Previous.empty()) {
+ // if we're in a dependent context. If the function is known to be a
+ // redeclaration, we will have narrowed Previous down to the right decl.
+ if (D.isRedeclaration()) {
Diag(FD->getLocation(), diag::err_friend_decl_with_def_arg_redeclared);
Diag(Previous.getRepresentativeDecl()->getLocation(),
diag::note_previous_declaration);
Modified: cfe/trunk/test/SemaCXX/friend.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/friend.cpp?rev=284802&r1=284801&r2=284802&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/friend.cpp (original)
+++ cfe/trunk/test/SemaCXX/friend.cpp Thu Oct 20 22:15:03 2016
@@ -379,3 +379,12 @@ namespace tag_redecl {
X *q = p;
}
}
+
+namespace default_arg {
+ void f();
+ void f(void*); // expected-note {{previous}}
+ struct X {
+ friend void f(int a, int b = 0) {}
+ friend void f(void *p = 0) {} // expected-error {{must be the only}}
+ };
+}
More information about the cfe-commits
mailing list