Fix crash in typo correction while correcting enum within a struct in C
authorOlivier Goffart <ogoffart@woboq.com>
Fri, 9 Jan 2015 09:37:26 +0000 (09:37 +0000)
committerOlivier Goffart <ogoffart@woboq.com>
Fri, 9 Jan 2015 09:37:26 +0000 (09:37 +0000)
llvm-svn: 225513

clang/lib/Sema/SemaExprCXX.cpp
clang/test/Sema/typo-correction.c

index 6351b7d..422398e 100644 (file)
@@ -5991,8 +5991,10 @@ static ExprResult attemptRecovery(Sema &SemaRef,
       if (auto *NNS = TC.getCorrectionSpecifier())
         Record = NNS->getAsType()->getAsCXXRecordDecl();
       if (!Record)
-        Record = cast<CXXRecordDecl>(ND->getDeclContext()->getRedeclContext());
-      R.setNamingClass(Record);
+        Record =
+            dyn_cast<CXXRecordDecl>(ND->getDeclContext()->getRedeclContext());
+      if (Record)
+        R.setNamingClass(Record);
 
       // Detect and handle the case where the decl might be an implicit
       // member.
index e4d1465..d8524b9 100644 (file)
@@ -12,3 +12,14 @@ void PR21656() {
 
 a = b ? : 0;  // expected-warning {{type specifier missing, defaults to 'int'}} \
               // expected-error {{use of undeclared identifier 'b'}}
+
+struct ContainerStuct {
+  enum { SOME_ENUM }; // expected-note {{'SOME_ENUM' declared here}}
+};
+
+void func(int arg) {
+  switch (arg) {
+  case SOME_ENUM_:
+    ; // expected-error {{use of undeclared identifier 'SOME_ENUM_'; did you mean 'SOME_ENUM'}}
+  }
+}