aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2011-07-14 04:54:23 +0000
committerDouglas Gregor <dgregor@apple.com>2011-07-14 04:54:23 +0000
commit3a348c86ffaebd3ba8bd9bbae342b6e9f5f62cd7 (patch)
treeec1ba0479888b66423d86d201663f90e15f3c18d
parenta944b123e49790e4cb0a8f4d6ee3a65e185127aa (diff)
Add a hackaround to avoid the crash in PR10355. However, our recovery
is still terrible here because typo correction is not behaving well in the presence of overloaded functions. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@135128 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Sema/SemaDecl.cpp6
-rw-r--r--test/FixIt/typo-crash.cpp11
2 files changed, 15 insertions, 2 deletions
diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp
index ebb1324dcd..9d91a48bdc 100644
--- a/lib/Sema/SemaDecl.cpp
+++ b/lib/Sema/SemaDecl.cpp
@@ -515,6 +515,7 @@ Corrected:
// Perform typo correction to determine if there is another name that is
// close to this name.
if (!SecondTry) {
+ SecondTry = true;
if (TypoCorrection Corrected = CorrectTypo(Result.getLookupNameInfo(),
Result.getLookupKind(), S, &SS)) {
unsigned UnqualifiedDiag = diag::err_undeclared_var_use_suggest;
@@ -560,8 +561,9 @@ Corrected:
if (Corrected.isKeyword())
return Corrected.getCorrectionAsIdentifierInfo();
- Diag(FirstDecl->getLocation(), diag::note_previous_decl)
- << CorrectedQuotedStr;
+ if (FirstDecl)
+ Diag(FirstDecl->getLocation(), diag::note_previous_decl)
+ << CorrectedQuotedStr;
// If we found an Objective-C instance variable, let
// LookupInObjCMethod build the appropriate expression to
diff --git a/test/FixIt/typo-crash.cpp b/test/FixIt/typo-crash.cpp
new file mode 100644
index 0000000000..b156e1b44c
--- /dev/null
+++ b/test/FixIt/typo-crash.cpp
@@ -0,0 +1,11 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+
+// FIXME: The diagnostics and recovery here are very, very poor.
+
+// PR10355
+template<typename T> void template_id1() {
+ template_id2<> t; // expected-error 2{{use of undeclared identifier 'template_id2'; did you mean 'template_id1'?}} \
+ // expected-error{{expected expression}} \
+ // expected-error{{use of undeclared identifier 't'}}
+ }
+