diff options
author | Nathan Sidwell <nathan@acm.org> | 2015-02-19 14:03:22 +0000 |
---|---|---|
committer | Nathan Sidwell <nathan@acm.org> | 2015-02-19 14:03:22 +0000 |
commit | 5bb231c2797a50261358374ea118381f621ac956 (patch) | |
tree | b95a7f0ae6fed6b39dc92c18447a40b4c4a54df8 /clang/lib/Parse/ParseCXXInlineMethods.cpp | |
parent | 2c0390ca4bcee9229f43bb50a577717c5198274b (diff) | |
download | bcm5719-llvm-5bb231c2797a50261358374ea118381f621ac956.tar.gz bcm5719-llvm-5bb231c2797a50261358374ea118381f621ac956.zip |
FIX PR 18432, default args, friends & late-parsed members.
Sema::MergeCXXFunctionDecl: propagate hasUnparsedDefaultArg to new decl.
Parser::HandleMemberFunctionDeclDelays: check hasUnparsedDefaultArg
flag.
Parser::ParseLexedMethodDeclaration: handle inherited unparsed default
arg case.
llvm-svn: 229852
Diffstat (limited to 'clang/lib/Parse/ParseCXXInlineMethods.cpp')
-rw-r--r-- | clang/lib/Parse/ParseCXXInlineMethods.cpp | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/clang/lib/Parse/ParseCXXInlineMethods.cpp b/clang/lib/Parse/ParseCXXInlineMethods.cpp index 6f13b9dc29c..a53079b260d 100644 --- a/clang/lib/Parse/ParseCXXInlineMethods.cpp +++ b/clang/lib/Parse/ParseCXXInlineMethods.cpp @@ -306,8 +306,9 @@ void Parser::ParseLexedMethodDeclaration(LateParsedMethodDeclaration &LM) { ParseScope PrototypeScope(this, Scope::FunctionPrototypeScope | Scope::FunctionDeclarationScope | Scope::DeclScope); for (unsigned I = 0, N = LM.DefaultArgs.size(); I != N; ++I) { - auto Param = LM.DefaultArgs[I].Param; + auto Param = cast<ParmVarDecl>(LM.DefaultArgs[I].Param); // Introduce the parameter into scope. + bool HasUnparsed = Param->hasUnparsedDefaultArg(); Actions.ActOnDelayedCXXMethodParameter(getCurScope(), Param); if (CachedTokens *Toks = LM.DefaultArgs[I].Toks) { // Mark the end of the default argument so that we know when to stop when @@ -371,6 +372,16 @@ void Parser::ParseLexedMethodDeclaration(LateParsedMethodDeclaration &LM) { delete Toks; LM.DefaultArgs[I].Toks = nullptr; + } else if (HasUnparsed) { + assert(Param->hasInheritedDefaultArg()); + FunctionDecl *Old = cast<FunctionDecl>(LM.Method)->getPreviousDecl(); + ParmVarDecl *OldParam = Old->getParamDecl(I); + assert (!OldParam->hasUnparsedDefaultArg()); + if (OldParam->hasUninstantiatedDefaultArg()) + Param->setUninstantiatedDefaultArg( + Param->getUninstantiatedDefaultArg()); + else + Param->setDefaultArg(OldParam->getInit()); } } |