Index: clang/lib/Parse/ParseCXXInlineMethods.cpp =================================================================== --- clang/lib/Parse/ParseCXXInlineMethods.cpp +++ clang/lib/Parse/ParseCXXInlineMethods.cpp @@ -405,14 +405,22 @@ ConsumeAnyToken(); } else if (HasUnparsed) { assert(Param->hasInheritedDefaultArg()); - FunctionDecl *Old = cast(LM.Method)->getPreviousDecl(); - ParmVarDecl *OldParam = Old->getParamDecl(I); - assert (!OldParam->hasUnparsedDefaultArg()); - if (OldParam->hasUninstantiatedDefaultArg()) - Param->setUninstantiatedDefaultArg( - OldParam->getUninstantiatedDefaultArg()); + const FunctionDecl *Old; + if (const auto *FunTmpl = + dyn_cast(LM.Method)) + Old = + cast(FunTmpl->getTemplatedDecl())->getPreviousDecl(); else - Param->setDefaultArg(OldParam->getInit()); + Old = cast(LM.Method)->getPreviousDecl(); + if (Old) { + ParmVarDecl *OldParam = const_cast(Old->getParamDecl(I)); + assert(!OldParam->hasUnparsedDefaultArg()); + if (OldParam->hasUninstantiatedDefaultArg()) + Param->setUninstantiatedDefaultArg( + OldParam->getUninstantiatedDefaultArg()); + else + Param->setDefaultArg(OldParam->getInit()); + } } } Index: clang/test/SemaCXX/invalid-decl.cpp =================================================================== --- /dev/null +++ clang/test/SemaCXX/invalid-decl.cpp @@ -0,0 +1,11 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s + +class test1 { + template friend int bar(bool = true) {} // expected-note {{previous declaration is here}} + template friend int bar(bool); // expected-error {{friend declaration specifying a default argument must be the only declaration}} +}; + +class test2 { + friend int bar(bool = true) {} // expected-note {{previous declaration is here}} + friend int bar(bool); // expected-error{{friend declaration specifying a default argument must be the only declaration}} +};