[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