]> granicus.if.org Git - clang/commitdiff
Change the checks in the type aka printing. A confusing case where the string
authorRichard Trieu <rtrieu@google.com>
Mon, 14 Nov 2011 19:39:25 +0000 (19:39 +0000)
committerRichard Trieu <rtrieu@google.com>
Mon, 14 Nov 2011 19:39:25 +0000 (19:39 +0000)
of the first type is the same as the aka string of the second type, but both
types are different.  Update the logic to print an aka for the first type to
show that they are different.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@144558 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/ASTDiagnostic.cpp
test/Misc/diag-aka-types.cpp

index 07820dc3cc56930e2bc9c1e5a35c7d129598fa25..dd3be44a1f5601c0bd418f574768afa6e88a804c 100644 (file)
@@ -171,9 +171,16 @@ ConvertTypeToDiagnosticString(ASTContext &Context, QualType Ty,
     if (CompareCanTy == CanTy)
       continue;  // Same canonical types
     std::string CompareS = CompareTy.getAsString(Context.getPrintingPolicy());
-    if (CompareS != S)
-      continue;  // Original strings are different
-    std::string CompareCanS = CompareCanTy.getAsString(Context.getPrintingPolicy());
+    bool aka;
+    QualType CompareDesugar = Desugar(Context, CompareTy, aka);
+    std::string CompareDesugarStr =
+        CompareDesugar.getAsString(Context.getPrintingPolicy());
+    if (CompareS != S && CompareDesugarStr != S)
+      continue;  // The type string is different than the comparison string
+                 // and the desugared comparison string.
+    std::string CompareCanS =
+        CompareCanTy.getAsString(Context.getPrintingPolicy());
+    
     if (CompareCanS == CanS)
       continue;  // No new info from canonical type
 
index 0339b7b63e82b01df0198fb3dc5200e786af7a2f..7459bc5c65cf0c5439b090de9902421e65956c8f 100644 (file)
@@ -50,3 +50,19 @@ namespace std {
     f(v);  // expected-error{{no matching function for call to 'f'}}
   }
 }
+
+namespace ns {
+ struct str {
+   static void method(struct data *) {}
+ };
+}
+
+struct data { int i; };
+
+typedef void (*callback)(struct data *);
+
+void helper(callback cb) {} // expected-note{{candidate function not viable: no known conversion from 'void (*)(struct data *)' (aka 'void (*)(ns::data *)') to 'callback' (aka 'void (*)(struct data *)') for 1st argument;}}
+
+void test() {
+ helper(&ns::str::method); // expected-error{{no matching function for call to 'helper'}}
+}