From: Vassil Vassilev Date: Wed, 18 May 2016 15:14:46 +0000 (+0000) Subject: Teach Sema::MergeFunctionDecl to properly check for an out-of-line definition of... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=334ff89aa7079f385ca3889bd44fde374f180d94;p=clang Teach Sema::MergeFunctionDecl to properly check for an out-of-line definition of a function that is declared as =default in its class definition. First part of PR27699. Patch by Cristina Cristescu! Reviewed by Richard Smith and me. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@269935 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 75aca834d2..d34d9b5688 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -2993,7 +2993,7 @@ bool Sema::MergeFunctionDecl(FunctionDecl *New, NamedDecl *&OldD, << New << getSpecialMember(OldMethod); return true; } - } else if (OldMethod->isExplicitlyDefaulted() && !isFriend) { + } else if (OldMethod->getFirstDecl()->isExplicitlyDefaulted() && !isFriend) { Diag(NewMethod->getLocation(), diag::err_definition_of_explicitly_defaulted_member) << getSpecialMember(OldMethod); diff --git a/test/SemaCXX/cxx0x-defaulted-functions.cpp b/test/SemaCXX/cxx0x-defaulted-functions.cpp index 617a257163..2aaf6197b6 100644 --- a/test/SemaCXX/cxx0x-defaulted-functions.cpp +++ b/test/SemaCXX/cxx0x-defaulted-functions.cpp @@ -150,6 +150,14 @@ namespace PR13527 { Y::~Y() = default; // expected-error {{definition of explicitly defaulted}} } +namespace PR27699 { + struct X { + X(); + }; + X::X() = default; // expected-note {{here}} + X::X() = default; // expected-error {{redefinition of 'X'}} +} + namespace PR14577 { template struct Outer {