<div class="gmail_quote">On Sun, May 16, 2010 at 1:44 PM, Douglas Gregor <span dir="ltr"><<a href="mailto:dgregor@apple.com">dgregor@apple.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
I am beginning to doubt our decision to inherit ParmVarDecl from VarDecl.<br></blockquote><div><br></div><div>I can't tell whether that is the problem, or whether the decision to represent default arguments as initializers is the problem. Fundamentally, parameters   *are* variables within the function, so it does seem a reasonable way to represent them.</div>
<div><br></div><div>A slight counter proposal: we re-use the storage of initializers for default arguments, but the accessor methods for initializers should filter them out, and ParmVarDecl should provide a dedicated API. Would that resolve this? Does it introduce other problems?</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<br>
Sent from my iPhone<br>
<div><div></div><div class="h5"><br>
On May 16, 2010, at 2:32 AM, Chandler Carruth <<a href="mailto:chandlerc@gmail.com">chandlerc@gmail.com</a>> wrote:<br>
<br>
> Author: chandlerc<br>
> Date: Sun May 16 04:32:51 2010<br>
> New Revision: 103904<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=103904&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=103904&view=rev</a><br>
> Log:<br>
> When constant folding reference variables with an initializer to the<br>
> initializer, don't fold paramters. Their initializers are just default<br>
> arguments which can be overridden. This fixes some spectacular regressions due<br>
> to more things making it into the constant folding.<br>
><br>
> Modified:<br>
>    cfe/trunk/lib/AST/ExprConstant.cpp<br>
>    cfe/trunk/test/CodeGenCXX/references.cpp<br>
><br>
> Modified: cfe/trunk/lib/AST/ExprConstant.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprConstant.cpp?rev=103904&r1=103903&r2=103904&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprConstant.cpp?rev=103904&r1=103903&r2=103904&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/lib/AST/ExprConstant.cpp (original)<br>
> +++ cfe/trunk/lib/AST/ExprConstant.cpp Sun May 16 04:32:51 2010<br>
> @@ -355,6 +355,10 @@<br>
>   } else if (VarDecl* VD = dyn_cast<VarDecl>(E->getDecl())) {<br>
>     if (!VD->getType()->isReferenceType())<br>
>       return Success(E);<br>
> +    // Reference parameters can refer to anything even if they have an<br>
> +    // "initializer" in the form of a default argument.<br>
> +    if (isa<ParmVarDecl>(VD))<br>
> +      return false;<br>
>     // FIXME: Check whether VD might be overridden!<br>
>     if (const Expr *Init = VD->getAnyInitializer())<br>
>       return Visit(const_cast<Expr *>(Init));<br>
><br>
> Modified: cfe/trunk/test/CodeGenCXX/references.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/references.cpp?rev=103904&r1=103903&r2=103904&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/references.cpp?rev=103904&r1=103903&r2=103904&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/test/CodeGenCXX/references.cpp (original)<br>
> +++ cfe/trunk/test/CodeGenCXX/references.cpp Sun May 16 04:32:51 2010<br>
> @@ -155,3 +155,16 @@<br>
> // CHECK: load<br>
> // CHECK: ret<br>
> const int &f2() { return 0; }<br>
> +<br>
> +// Don't constant fold const reference parameters with default arguments to<br>
> +// their default arguments.<br>
> +namespace N1 {<br>
> +  const int foo = 1;<br>
> +  // CHECK: @_ZN2N14test<br>
> +  int test(const int& arg = foo) {<br>
> +    // Ensure this array is on the stack where we can set values instead of<br>
> +    // being a global constant.<br>
> +    // CHECK: %args_array = alloca<br>
> +    const int* const args_array[] = { &arg };<br>
> +  }<br>
> +}<br>
><br>
><br>
> _______________________________________________<br>
> cfe-commits mailing list<br>
> <a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</div></div></blockquote></div><br>