diff options
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 22 | ||||
| -rw-r--r-- | clang/test/FixIt/typo.c | 4 | ||||
| -rw-r--r-- | clang/test/FixIt/typo.cpp | 3 |
3 files changed, 23 insertions, 6 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 6c25ddfca54..200082f17b3 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -510,12 +510,29 @@ Corrected: // close to this name. if (!SecondTry) { if (DeclarationName Corrected = CorrectTypo(Result, S, &SS)) { + unsigned UnqualifiedDiag = diag::err_undeclared_var_use_suggest; + unsigned QualifiedDiag = diag::err_no_member_suggest; + + NamedDecl *FirstDecl = Result.empty()? 0 : *Result.begin(); + + if (getLangOptions().CPlusPlus && NextToken.is(tok::less) && + FirstDecl && isa<TemplateDecl>(FirstDecl)) { + UnqualifiedDiag = diag::err_no_template_suggest; + QualifiedDiag = diag::err_no_member_template_suggest; + } else if (FirstDecl && + (isa<TypeDecl>(FirstDecl) || + isa<ObjCInterfaceDecl>(FirstDecl) || + isa<ObjCCompatibleAliasDecl>(FirstDecl))) { + UnqualifiedDiag = diag::err_unknown_typename_suggest; + QualifiedDiag = diag::err_unknown_nested_typename_suggest; + } + if (SS.isEmpty()) - Diag(NameLoc, diag::err_undeclared_var_use_suggest) + Diag(NameLoc, UnqualifiedDiag) << Name << Corrected << FixItHint::CreateReplacement(NameLoc, Corrected.getAsString()); else - Diag(NameLoc, diag::err_no_member_suggest) + Diag(NameLoc, QualifiedDiag) << Name << computeDeclContext(SS, false) << Corrected << SS.getRange() << FixItHint::CreateReplacement(NameLoc, Corrected.getAsString()); @@ -527,7 +544,6 @@ Corrected: if (Result.empty()) return Corrected.getAsIdentifierInfo(); - NamedDecl *FirstDecl = *Result.begin(); Diag(FirstDecl->getLocation(), diag::note_previous_decl) << FirstDecl->getDeclName(); diff --git a/clang/test/FixIt/typo.c b/clang/test/FixIt/typo.c index 8a277c75f03..88d9dc62a1f 100644 --- a/clang/test/FixIt/typo.c +++ b/clang/test/FixIt/typo.c @@ -1,6 +1,6 @@ // RUN: %clang_cc1 -fsyntax-only -verify %s // RUN: cp %s %t -// RUN: %clang_cc1 -fsyntax-only -fixit -x c %t || true +// RUN: not %clang_cc1 -fsyntax-only -fixit -x c %t // RUN: %clang_cc1 -fsyntax-only -pedantic -Werror -x c %t // RUN: grep "Rectangle" %t struct Point { @@ -30,7 +30,7 @@ void test() { r1.top_left.x = 0; typedef struct Rectangle Rectangle; // expected-note{{'Rectangle' declared here}} - rectangle *r2 = &r1; // expected-error{{use of undeclared identifier 'rectangle'; did you mean 'Rectangle'?}} + rectangle *r2 = &r1; // expected-error{{ unknown type name 'rectangle'; did you mean 'Rectangle'?}} r2->top_left.y = 0; unsinged *ptr = 0; // expected-error{{use of undeclared identifier 'unsinged'; did you mean 'unsigned'?}} *ptr = 17; diff --git a/clang/test/FixIt/typo.cpp b/clang/test/FixIt/typo.cpp index d1e732fd1db..440db455189 100644 --- a/clang/test/FixIt/typo.cpp +++ b/clang/test/FixIt/typo.cpp @@ -1,7 +1,8 @@ // RUN: %clang_cc1 -fsyntax-only -verify %s // RUN: cp %s %t -// RUN: %clang_cc1 -fsyntax-only -fixit -x c++ %t || true +// RUN: not %clang_cc1 -fsyntax-only -fixit -x c++ %t // RUN: %clang_cc1 -fsyntax-only -pedantic -Werror -x c++ %t +// RUN: grep test_string %t namespace std { template<typename T> class basic_string { // expected-note 2{{'basic_string' declared here}} |

