diff options
-rw-r--r-- | lib/AST/ASTDiagnostic.cpp | 13 | ||||
-rw-r--r-- | test/Misc/diag-aka-types.cpp | 16 |
2 files changed, 26 insertions, 3 deletions
diff --git a/lib/AST/ASTDiagnostic.cpp b/lib/AST/ASTDiagnostic.cpp index 07820dc3cc..dd3be44a1f 100644 --- a/lib/AST/ASTDiagnostic.cpp +++ b/lib/AST/ASTDiagnostic.cpp @@ -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 diff --git a/test/Misc/diag-aka-types.cpp b/test/Misc/diag-aka-types.cpp index 0339b7b63e..7459bc5c65 100644 --- a/test/Misc/diag-aka-types.cpp +++ b/test/Misc/diag-aka-types.cpp @@ -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'}} +} |