summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaDecl.cpp
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2018-03-01 22:20:13 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2018-03-01 22:20:13 +0000
commit05ce1d3944394be8bba20d50c8da77ff3a1b657e (patch)
tree9bef8c8995d1b7bdfd3f99adef830e82b5248373 /clang/lib/Sema/SemaDecl.cpp
parenteedfbc4ab7df2b9ddeb0674e8ef75c3cac550384 (diff)
downloadbcm5719-llvm-05ce1d3944394be8bba20d50c8da77ff3a1b657e.tar.gz
bcm5719-llvm-05ce1d3944394be8bba20d50c8da77ff3a1b657e.zip
[modules] Don't diagnose "redefinition" of a friend with a pending definition
if the other definition is a merged copy of the same function. llvm-svn: 326496
Diffstat (limited to 'clang/lib/Sema/SemaDecl.cpp')
-rw-r--r--clang/lib/Sema/SemaDecl.cpp9
1 files changed, 9 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 62fd0207715..b358b04142f 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -12303,6 +12303,15 @@ Sema::CheckForFunctionRedefinition(FunctionDecl *FD,
if (I != FD && !I->isInvalidDecl() &&
I->getFriendObjectKind() != Decl::FOK_None) {
if (FunctionDecl *Original = I->getInstantiatedFromMemberFunction()) {
+ if (FunctionDecl *OrigFD = FD->getInstantiatedFromMemberFunction()) {
+ // A merged copy of the same function, instantiated as a member of
+ // the same class, is OK.
+ if (declaresSameEntity(OrigFD, Original) &&
+ declaresSameEntity(cast<Decl>(I->getLexicalDeclContext()),
+ cast<Decl>(FD->getLexicalDeclContext())))
+ continue;
+ }
+
if (Original->isThisDeclarationADefinition()) {
Definition = I;
break;
OpenPOWER on IntegriCloud