r213609 - Fix a template diffing problem were an '&' is unexpectedly printed in

Richard Trieu rtrieu at google.com
Tue Aug 26 23:35:36 PDT 2014


The refactor in r216526 has taken care of this.


On Tue, Jul 22, 2014 at 6:47 AM, Benjamin Kramer <benny.kra at gmail.com>
wrote:

> On Tue, Jul 22, 2014 at 5:33 AM, Richard Trieu <rtrieu at google.com> wrote:
> > Author: rtrieu
> > Date: Mon Jul 21 22:33:01 2014
> > New Revision: 213609
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=213609&view=rev
> > Log:
> > Fix a template diffing problem were an '&' is unexpectedly printed in
> > a template argument.
> >
> > Modified:
> >     cfe/trunk/lib/AST/ASTDiagnostic.cpp
> >     cfe/trunk/test/Misc/diag-template-diffing.cpp
> >
> > Modified: cfe/trunk/lib/AST/ASTDiagnostic.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTDiagnostic.cpp?rev=213609&r1=213608&r2=213609&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/AST/ASTDiagnostic.cpp (original)
> > +++ cfe/trunk/lib/AST/ASTDiagnostic.cpp Mon Jul 21 22:33:01 2014
> > @@ -991,12 +991,32 @@ class TemplateDiff {
> >            if (!HasToValueDecl && ToExpr)
> >              ToValueDecl = GetValueDecl(ToIter, ToExpr);
> >            QualType ArgumentType = DefaultNTTPD->getType();
> > -          bool FromAddressOf = FromValueDecl &&
> > -                               !ArgumentType->isReferenceType() &&
> > -                               !FromValueDecl->getType()->isArrayType();
> > -          bool ToAddressOf = ToValueDecl &&
> > -                             !ArgumentType->isReferenceType() &&
> > -                             !ToValueDecl->getType()->isArrayType();
> > +          bool FromAddressOf = false;
> > +          if (FromValueDecl) {
> > +            if (FromExpr) {
> > +              if (UnaryOperator *UO =
> dyn_cast<UnaryOperator>(FromExpr)) {
> > +                if (UO->getOpcode() == UO_AddrOf)
> > +                  FromAddressOf = true;
> > +              }
> > +            } else {
> > +              if (!ArgumentType->isReferenceType()) {
> > +                FromAddressOf = true;
> > +              }
> > +            }
> > +          }
> > +          bool ToAddressOf = false;
> > +          if (ToValueDecl) {
> > +            if (ToExpr) {
> > +              if (UnaryOperator *UO = dyn_cast<UnaryOperator>(ToExpr)) {
> > +                if (UO->getOpcode() == UO_AddrOf) {
> > +                  ToAddressOf = true;
> > +                }
> > +              }
> > +            } else {
> > +              if (!ArgumentType->isReferenceType())
> > +                ToAddressOf = true;
> > +            }
> > +          }
>
> Ugh, can you factor this into a predicate function? The code
> duplication is nasty. Early exits could also help to reduce the depth
> of nested ifs a bit in a helper function.
>
> - Ben
>
> >            Tree.SetNode(FromValueDecl, ToValueDecl, FromAddressOf,
> ToAddressOf);
> >            Tree.SetSame(FromValueDecl && ToValueDecl &&
> >                         FromValueDecl->getCanonicalDecl() ==
> >
> > Modified: cfe/trunk/test/Misc/diag-template-diffing.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Misc/diag-template-diffing.cpp?rev=213609&r1=213608&r2=213609&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/test/Misc/diag-template-diffing.cpp (original)
> > +++ cfe/trunk/test/Misc/diag-template-diffing.cpp Mon Jul 21 22:33:01
> 2014
> > @@ -1105,6 +1105,22 @@ using F = C<21 + 21>;
> >  }
> >  }
> >
> > +namespace AddressOf {
> > +template <int*>
> > +struct S {};
> > +
> > +template <class T>
> > +struct Wrapper {};
> > +
> > +template <class T>
> > +Wrapper<T> MakeWrapper();
> > +int global;
> > +constexpr int * ptr = nullptr;
> > +Wrapper<S<ptr>> W = MakeWrapper<S<&global>>();
> > +// Don't print an extra '&' for 'ptr'
> > +// CHECK-ELIDE-NOTREE: no viable conversion from 'Wrapper<S<&global>>'
> to 'Wrapper<S<ptr>>'
> > +}
> > +
> >  // CHECK-ELIDE-NOTREE: {{[0-9]*}} errors generated.
> >  // CHECK-NOELIDE-NOTREE: {{[0-9]*}} errors generated.
> >  // CHECK-ELIDE-TREE: {{[0-9]*}} errors generated.
> >
> >
> > _______________________________________________
> > cfe-commits mailing list
> > cfe-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140826/fadaccbe/attachment.html>


More information about the cfe-commits mailing list