[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