[cfe-commits] r155893 - in /cfe/trunk: lib/Sema/SemaTemplateInstantiate.cpp test/CodeGenCXX/destructors.cpp test/SemaCXX/conversion.cpp

Andrew Trick atrick at apple.com
Tue May 1 12:54:13 PDT 2012

On Apr 30, 2012, at 11:05 PM, David Blaikie <dblaikie at gmail.com> wrote:

> Author: dblaikie
> Date: Tue May  1 01:05:57 2012
> New Revision: 155893
> URL: http://llvm.org/viewvc/llvm-project?rev=155893&view=rev
> Log:
> PR12710 - broken default argument handling for templates.
> I broke this in r155838 by not actually instantiating non-dependent default arg
> expressions. The motivation for that change was to avoid producing duplicate
> conversion warnings for such default args (we produce them once when we parse
> the template - there's no need to produce them at each instantiation) but
> without actually instantiating the default arg, things break in weird ways.
> Technically, I think we could still get the right diagnostic experience without
> the bugs if we instantiated the non-dependent args (for non-dependent params
> only) immediately, rather than lazily. But I'm not sure if such a refactoring/
> change would be desirable so here's the conservative fix for now.
> Modified:
>    cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp
>    cfe/trunk/test/CodeGenCXX/destructors.cpp
>    cfe/trunk/test/SemaCXX/conversion.cpp


Would you mind reverting the corresponding change in SemaExpr? This change results in miscompilation of 483.xalancbmk. The miscompilation depends on the host compiler used to build clang, and I haven't determined the reason for it, but I do need to get tree in a healthy state ASAP. If you're sure this change is safe, then I can keep a bug open.


--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -3300,11 +3300,9 @@ ExprResult Sema::BuildCXXDefaultArgExpr(SourceLocation CallLoc,
     if (Result.isInvalid())
       return ExprError();

-    Expr *Arg = Result.takeAs<Expr>();
-    CheckImplicitConversions(Arg, Arg->getExprLoc());
-    Param->setDefaultArg(Arg);
     // Build the default argument expression.
-    return Owned(CXXDefaultArgExpr::Create(Context, CallLoc, Param, Arg));
+    return Owned(CXXDefaultArgExpr::Create(Context, CallLoc, Param,
+                                           Result.takeAs<Expr>()));

   // If the default expression creates temporaries, we need to

More information about the cfe-commits mailing list