On Apr 30, 2012, at 11:05 PM, David Blaikie <[email protected]> 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


David,

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.

-Andy

--- 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

_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to