<div dir="ltr">The refactor in r<span style="font-size:100%;font-family:arial,sans,sans-serif;text-align:right">216526 has taken care of this.</span></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Jul 22, 2014 at 6:47 AM, Benjamin Kramer <span dir="ltr"><<a href="mailto:benny.kra@gmail.com" target="_blank">benny.kra@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On Tue, Jul 22, 2014 at 5:33 AM, Richard Trieu <<a href="mailto:rtrieu@google.com">rtrieu@google.com</a>> wrote:<br>

> Author: rtrieu<br>
> Date: Mon Jul 21 22:33:01 2014<br>
> New Revision: 213609<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=213609&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=213609&view=rev</a><br>
> Log:<br>
> Fix a template diffing problem were an '&' is unexpectedly printed in<br>
> a template argument.<br>
><br>
> Modified:<br>
>     cfe/trunk/lib/AST/ASTDiagnostic.cpp<br>
>     cfe/trunk/test/Misc/diag-template-diffing.cpp<br>
><br>
> Modified: cfe/trunk/lib/AST/ASTDiagnostic.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTDiagnostic.cpp?rev=213609&r1=213608&r2=213609&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTDiagnostic.cpp?rev=213609&r1=213608&r2=213609&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/lib/AST/ASTDiagnostic.cpp (original)<br>
> +++ cfe/trunk/lib/AST/ASTDiagnostic.cpp Mon Jul 21 22:33:01 2014<br>
> @@ -991,12 +991,32 @@ class TemplateDiff {<br>
>            if (!HasToValueDecl && ToExpr)<br>
>              ToValueDecl = GetValueDecl(ToIter, ToExpr);<br>
>            QualType ArgumentType = DefaultNTTPD->getType();<br>
> -          bool FromAddressOf = FromValueDecl &&<br>
> -                               !ArgumentType->isReferenceType() &&<br>
> -                               !FromValueDecl->getType()->isArrayType();<br>
> -          bool ToAddressOf = ToValueDecl &&<br>
> -                             !ArgumentType->isReferenceType() &&<br>
> -                             !ToValueDecl->getType()->isArrayType();<br>
> +          bool FromAddressOf = false;<br>
> +          if (FromValueDecl) {<br>
> +            if (FromExpr) {<br>
> +              if (UnaryOperator *UO = dyn_cast<UnaryOperator>(FromExpr)) {<br>
> +                if (UO->getOpcode() == UO_AddrOf)<br>
> +                  FromAddressOf = true;<br>
> +              }<br>
> +            } else {<br>
> +              if (!ArgumentType->isReferenceType()) {<br>
> +                FromAddressOf = true;<br>
> +              }<br>
> +            }<br>
> +          }<br>
> +          bool ToAddressOf = false;<br>
> +          if (ToValueDecl) {<br>
> +            if (ToExpr) {<br>
> +              if (UnaryOperator *UO = dyn_cast<UnaryOperator>(ToExpr)) {<br>
> +                if (UO->getOpcode() == UO_AddrOf) {<br>
> +                  ToAddressOf = true;<br>
> +                }<br>
> +              }<br>
> +            } else {<br>
> +              if (!ArgumentType->isReferenceType())<br>
> +                ToAddressOf = true;<br>
> +            }<br>
> +          }<br>
<br>
</div></div>Ugh, can you factor this into a predicate function? The code<br>
duplication is nasty. Early exits could also help to reduce the depth<br>
of nested ifs a bit in a helper function.<br>
<br>
- Ben<br>
<div class="HOEnZb"><div class="h5"><br>
>            Tree.SetNode(FromValueDecl, ToValueDecl, FromAddressOf, ToAddressOf);<br>
>            Tree.SetSame(FromValueDecl && ToValueDecl &&<br>
>                         FromValueDecl->getCanonicalDecl() ==<br>
><br>
> Modified: cfe/trunk/test/Misc/diag-template-diffing.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Misc/diag-template-diffing.cpp?rev=213609&r1=213608&r2=213609&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Misc/diag-template-diffing.cpp?rev=213609&r1=213608&r2=213609&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/test/Misc/diag-template-diffing.cpp (original)<br>
> +++ cfe/trunk/test/Misc/diag-template-diffing.cpp Mon Jul 21 22:33:01 2014<br>
> @@ -1105,6 +1105,22 @@ using F = C<21 + 21>;<br>
>  }<br>
>  }<br>
><br>
> +namespace AddressOf {<br>
> +template <int*><br>
> +struct S {};<br>
> +<br>
> +template <class T><br>
> +struct Wrapper {};<br>
> +<br>
> +template <class T><br>
> +Wrapper<T> MakeWrapper();<br>
> +int global;<br>
> +constexpr int * ptr = nullptr;<br>
> +Wrapper<S<ptr>> W = MakeWrapper<S<&global>>();<br>
> +// Don't print an extra '&' for 'ptr'<br>
> +// CHECK-ELIDE-NOTREE: no viable conversion from 'Wrapper<S<&global>>' to 'Wrapper<S<ptr>>'<br>
> +}<br>
> +<br>
>  // CHECK-ELIDE-NOTREE: {{[0-9]*}} errors generated.<br>
>  // CHECK-NOELIDE-NOTREE: {{[0-9]*}} errors generated.<br>
>  // CHECK-ELIDE-TREE: {{[0-9]*}} errors generated.<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>
</div></div></blockquote></div><br></div>