diff options
author | Yaron Keren <yaron.keren@gmail.com> | 2017-04-17 08:51:20 +0000 |
---|---|---|
committer | Yaron Keren <yaron.keren@gmail.com> | 2017-04-17 08:51:20 +0000 |
commit | 27e2ff964fc3e18c27488e15dc74b44ef32d2fe0 (patch) | |
tree | 7ea962556c927a86fc590391ea20320b75fed0f0 /clang/lib/AST/Decl.cpp | |
parent | 11d9c4f691b68f8abcba85345abd4d3067cbee3f (diff) | |
download | bcm5719-llvm-27e2ff964fc3e18c27488e15dc74b44ef32d2fe0.tar.gz bcm5719-llvm-27e2ff964fc3e18c27488e15dc74b44ef32d2fe0.zip |
Address http://bugs.llvm.org/pr30994 so that a non-friend can properly replace a friend, and a visible friend can properly replace an invisible friend but not vice verse, and definitions are not replaced. This fixes the two FIXME in SemaTemplate/friend-template.cpp.
The code implements Richard Smith suggestion in comment 3 of the PR.
reviewer: Vassil Vassilev
Differential Revision: https://reviews.llvm.org/D31540
llvm-svn: 300443
Diffstat (limited to 'clang/lib/AST/Decl.cpp')
-rw-r--r-- | clang/lib/AST/Decl.cpp | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp index 2b22e5bb50a..6a288cdb21f 100644 --- a/clang/lib/AST/Decl.cpp +++ b/clang/lib/AST/Decl.cpp @@ -1536,6 +1536,10 @@ bool NamedDecl::declarationReplaces(NamedDecl *OldD, bool IsKnownNewer) const { if (isa<ObjCMethodDecl>(this)) return false; + if (getFriendObjectKind() > OldD->getFriendObjectKind() && + !isThisDeclarationADefinition()) + return false; + // For parameters, pick the newer one. This is either an error or (in // Objective-C) permitted as an extension. if (isa<ParmVarDecl>(this)) |