[clang/18432] Fix friend decl & default arg
Nathan Sidwell
nathan at acm.org
Fri Jan 30 10:09:51 PST 2015
This patch fixes 18432, where a friend decl for a nested class's member function
clobbered its default arg. http://llvm.org/bugs/show_bug.cgi?id=18432
As the report says, such a friend decl is unneeded, but it shouldn't break
things. There are 3 components to the problem:
1) Sema::MergeCXXFunctionDecl doesn't realize the Older decl could have an
unparsed default argument. Fixed by propagating that info to the new decl (but
not the tokens themselves). We now have a new possible state for a ParmVarDecl
-- null tokens but hasUnparsedDefaultArg set.
2) HandleMemberFunctionDeclDelays only looked at if there were default arg
tokens to parse. Changed to check the hasUnparsedDefaultArg state instead.
This puts both the original function decl and the befriending decl on the late
parsing list.
3) Parser::ParseLexedMethodDeclaration now needs to handle the case of an
inherited default parm. At the point it meets this decl, the original default
parm will have been parsed, so it just needs to duplicate the code that is now
skipped in MergeCXXFunctionDecl.
It has to look at the hasUnparsedDefaultArg flag before the
ActOnDelayedCXXMethodParameter call, because that clears the state. I wonder
whether the processing I've added to ParseLexedMethodDeclaration should be put
in ActOnDelayedCXXMethodParameter anyway? (we'd need to add FunctionDecl and
ParmIndex parameters if so). Alternatively should the now duplicated code
propagating the default arg be broken out of MergeCXXFunctionDecl and called
from there and ParseLexedMethodDeclaration?
I added a new test
tools/clang/test/CXX/dcl.decl/dcl.meaning/dcl.fct.default/p9.cpp, as this is a
bug in default arg handling, not in friendliness.
tested on x86_64-linux, ok?
nathan
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 18432-1.patch
Type: text/x-patch
Size: 3811 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150130/50786340/attachment.bin>
More information about the cfe-commits
mailing list