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

Douglas Gregor dgregor at apple.com
Mon Nov 29 10:28:13 PST 2010


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.

Sorry I missed this in my earlier review.

	- Doug



More information about the cfe-commits mailing list