[cfe-commits] r120299 - in /cfe/trunk: lib/Sema/SemaExpr.cpp test/SemaCXX/friend.cpp

Douglas Gregor dgregor at apple.com
Wed Dec 1 11:43:28 PST 2010


On Nov 29, 2010, at 8:47 PM, Nicolas Weber wrote:

>> On Nov 29, 2010, at 10:19 AM, Nico Weber wrote:
>> 
>>> Author: nico
>>> Date: Mon Nov 29 12:19:25 2010
>>> New Revision: 120299
>>> 
>>> URL: http://llvm.org/viewvc/llvm-project?rev=120299&view=rev
>>> Log:
>>> Always use a function's decl context when building default arguments.
>> Fixes http://http://llvm.org/pr8479.
>>> 
>>> Modified:
>>>   cfe/trunk/lib/Sema/SemaExpr.cpp
>>>   cfe/trunk/test/SemaCXX/friend.cpp
>>> 
>>> Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
>>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=120299&r1=120298&r2=120299&view=diff
>>> 
>> ==============================================================================
>>> --- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
>>> +++ cfe/trunk/lib/Sema/SemaExpr.cpp Mon Nov 29 12:19:25 2010
>>> @@ -3839,8 +3839,8 @@
>>> }
>>> 
>>> ExprResult Sema::BuildCXXDefaultArgExpr(SourceLocation CallLoc,
>>> -                                                    FunctionDecl *FD,
>>> -                                                    ParmVarDecl *Param)
>> {
>>> +                                        FunctionDecl *FD,
>>> +                                        ParmVarDecl *Param) {
>>>  if (Param->hasUnparsedDefaultArg()) {
>>>    Diag(CallLoc,
>>>          diag::err_use_of_default_argument_to_function_declared_later)
>> <<
>>> @@ -3857,12 +3857,20 @@
>>>    MultiLevelTemplateArgumentList ArgList
>>>      = getTemplateInstantiationArgs(FD, 0, /*RelativeToPrimary=*/true);
>>> 
>>> -    std::pair<const TemplateArgument *, unsigned> Innermost 
>>> +    std::pair<const TemplateArgument *, unsigned> Innermost
>>>      = ArgList.getInnermost();
>>>    InstantiatingTemplate Inst(*this, CallLoc, Param, Innermost.first,
>>>                               Innermost.second);
>>> 
>>> -    ExprResult Result = SubstExpr(UninstExpr, ArgList);
>>> +    ExprResult Result;
>>> +    {
>>> +      // C++ [dcl.fct.default]p5:
>>> +      //   The names in the [default argument] expression are bound,
>> and
>>> +      //   the semantic constraints are checked, at the point where the
>>> +      //   default argument expression appears.
>>> +      ContextRAII SavedContext(*this, FD->getDeclContext());
>>> +      Result = SubstExpr(UninstExpr, ArgList);
>>> +    }
>>>    if (Result.isInvalid())
>>>      return ExprError();
>> 
>> I know I just approved this, but... don't you want to use "FD" as the
>> DeclContext, rather than the context in which FD is declared? It would matter
>> if the function itself was friended but the class was not, for example.
> 
> Fixed in r120389. Thanks for spotting this. (pr8705 is still open, though.)

Thanks!

	- Doug



More information about the cfe-commits mailing list