Change the checks in the type aka printing. A confusing case where the string

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
This commit is contained in:
Richard Trieu 2011-11-14 19:39:25 +00:00
Родитель ccf1bfde16
Коммит ecb912e8a2
2 изменённых файлов: 26 добавлений и 3 удалений

Просмотреть файл

@ -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

Просмотреть файл

@ -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'}}
}