[prev in list] [next in list] [prev in thread] [next in thread]
List: cfe-commits
Subject: [PATCH] Fix crash in typo correction while correcting enum within a struct in C
From: Olivier Goffart <ogoffart () kde ! org>
Date: 2015-01-08 21:12:40
Message-ID: 1864234.8JDiSoNOGn () finn
[Download RAW message or body]
Hi,
Please review the attached patch.
It fix a crash while trying to compile the code that is in the testcase (in C
mode). This crash is a regression since 3.5
The problem is that "isCXXClassMember" for the NameDecl of the enum values
returns true even tough we are in C mode. Therefore, the DeclContext is not a
CXXRecordDecl, but just a plain RecordDecl.
I'm taking the least intrusive approach by handling the case in which the cast
would otherwise fail.
Thanks
--
Olivier
["0001-Fix-crash-in-typo-correction-while-correcting-enum-w.patch" (0001-Fix-crash-in-typo-correction-while-correcting-enum-w.patch)]
From 64b19f4397b75a68ba5a0e6054fefc2e4ab6ad06 Mon Sep 17 00:00:00 2001
From: Olivier Goffart <ogoffart@woboq.com>
Date: Thu, 8 Jan 2015 21:50:52 +0100
Subject: [PATCH] Fix crash in typo correction while correcting enum within a
struct in C
---
lib/Sema/SemaExprCXX.cpp | 5 +++--
test/Sema/typo-correction.c | 12 ++++++++++++
2 files changed, 15 insertions(+), 2 deletions(-)
diff --git a/lib/Sema/SemaExprCXX.cpp b/lib/Sema/SemaExprCXX.cpp
index 6351b7d..750a40e 100644
--- a/lib/Sema/SemaExprCXX.cpp
+++ b/lib/Sema/SemaExprCXX.cpp
@@ -5991,8 +5991,9 @@ 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.
diff --git a/test/Sema/typo-correction.c b/test/Sema/typo-correction.c
index e4d1465..4fbc38f 100644
--- a/test/Sema/typo-correction.c
+++ b/test/Sema/typo-correction.c
@@ -12,3 +12,15 @@ 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'}} + }
+}
--
2.2.1
_______________________________________________
cfe-commits mailing list
cfe-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic