diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2018-03-01 22:20:13 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2018-03-01 22:20:13 +0000 |
commit | 05ce1d3944394be8bba20d50c8da77ff3a1b657e (patch) | |
tree | 9bef8c8995d1b7bdfd3f99adef830e82b5248373 /clang/lib/Sema/SemaDecl.cpp | |
parent | eedfbc4ab7df2b9ddeb0674e8ef75c3cac550384 (diff) | |
download | bcm5719-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.cpp | 9 |
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; |