[clang/18432] Fix friend decl & default arg
Richard Smith
richard at metafoo.co.uk
Tue Feb 17 19:35:11 PST 2015
Sorry for the delay. The patch looks good, other than some style issues:
+ if (OldParam->hasUnparsedDefaultArg ())
+ NewParam->setUnparsedDefaultArg ();
No spaces before ().
if (!NeedLateParse)
// Look ahead to see if there are any default args
- for (unsigned ParamIdx = 0; ParamIdx < FTI.NumParams; ++ParamIdx)
- if (FTI.Params[ParamIdx].DefaultArgTokens) {
+ for (unsigned ParamIdx = 0; ParamIdx < FTI.NumParams; ++ParamIdx) {
+ auto Param = cast<ParmVarDecl>(FTI.Params[ParamIdx].Param);
+ if (Param->hasUnparsedDefaultArg()) {
NeedLateParse = true;
break;
}
+ }
Please add braces around this 'if', since its body contains many lines.
test/CXX/dcl.decl/dcl.meaning/dcl.fct.default/p9.cpp
I'm not really sure what part of p9 this is testing; it seems more to be a
test of p4, where inheritance of default arguments is specified.
On Fri, Feb 6, 2015 at 5:33 AM, Nathan Sidwell <nathan at acm.org> wrote:
> ping?
>
>
> On 01/30/15 13:09, Nathan Sidwell wrote:
>
>> 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 --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150217/2013d7d5/attachment.html>
More information about the cfe-commits
mailing list