summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST
diff options
context:
space:
mode:
authorRichard Trieu <rtrieu@google.com>2014-07-22 03:33:01 +0000
committerRichard Trieu <rtrieu@google.com>2014-07-22 03:33:01 +0000
commit965cfa1d5bcb926b13591ed8838195bdfe956e5d (patch)
tree3e94f82251b20cb30797d15c69ce008e8dc38f6a /clang/lib/AST
parent47bdc929e38d2a775cbd65adcb4efeff04540fca (diff)
downloadbcm5719-llvm-965cfa1d5bcb926b13591ed8838195bdfe956e5d.tar.gz
bcm5719-llvm-965cfa1d5bcb926b13591ed8838195bdfe956e5d.zip
Fix a template diffing problem were an '&' is unexpectedly printed in
a template argument. llvm-svn: 213609
Diffstat (limited to 'clang/lib/AST')
-rw-r--r--clang/lib/AST/ASTDiagnostic.cpp32
1 files changed, 26 insertions, 6 deletions
diff --git a/clang/lib/AST/ASTDiagnostic.cpp b/clang/lib/AST/ASTDiagnostic.cpp
index 2ee26fb7a74..15e288acb9a 100644
--- a/clang/lib/AST/ASTDiagnostic.cpp
+++ b/clang/lib/AST/ASTDiagnostic.cpp
@@ -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;
+ }
+ }
Tree.SetNode(FromValueDecl, ToValueDecl, FromAddressOf, ToAddressOf);
Tree.SetSame(FromValueDecl && ToValueDecl &&
FromValueDecl->getCanonicalDecl() ==
OpenPOWER on IntegriCloud