summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2016-06-08 16:05:07 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2016-06-08 16:05:07 +0000
commite56d1a0d5000e1b935803a0f77edf2124114a522 (patch)
tree5800dccb455f9ba78968cb73a3f648b554e9b148
parenta41272fb4833b6f4a472bd7aaa6ad7ca40ee8744 (diff)
downloadbcm5719-llvm-e56d1a0d5000e1b935803a0f77edf2124114a522.tar.gz
bcm5719-llvm-e56d1a0d5000e1b935803a0f77edf2124114a522.zip
[Sema] Don't permit catching variably modified types
Variably modified types shouldn't be permitted in catch clauses. This fixes PR28047. llvm-svn: 272159
-rw-r--r--clang/include/clang/Basic/DiagnosticSemaKinds.td2
-rw-r--r--clang/lib/Sema/SemaDeclCXX.cpp5
-rw-r--r--clang/test/SemaCXX/exceptions.cpp14
3 files changed, 21 insertions, 0 deletions
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 9789609d5ad..1813544a78c 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -5904,6 +5904,8 @@ def err_catch_incomplete_ref : Error<
"cannot catch reference to incomplete type %0">;
def err_catch_incomplete : Error<"cannot catch incomplete type %0">;
def err_catch_rvalue_ref : Error<"cannot catch exceptions by rvalue reference">;
+def err_catch_variably_modified : Error<
+ "cannot catch variably modified type %0">;
def err_qualified_catch_declarator : Error<
"exception declarator cannot be qualified">;
def err_early_catch_all : Error<"catch-all handler must come last">;
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index 8212bd4db3f..1ab3fb2ab86 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -12207,6 +12207,11 @@ VarDecl *Sema::BuildExceptionDeclaration(Scope *S,
Invalid = true;
}
+ if (ExDeclType->isVariablyModifiedType()) {
+ Diag(Loc, diag::err_catch_variably_modified) << ExDeclType;
+ Invalid = true;
+ }
+
QualType BaseType = ExDeclType;
int Mode = 0; // 0 for direct type, 1 for pointer, 2 for reference
unsigned DK = diag::err_catch_incomplete;
diff --git a/clang/test/SemaCXX/exceptions.cpp b/clang/test/SemaCXX/exceptions.cpp
index 05793e2ffc8..9e76783ca8a 100644
--- a/clang/test/SemaCXX/exceptions.cpp
+++ b/clang/test/SemaCXX/exceptions.cpp
@@ -268,3 +268,17 @@ void g() {
}
}
}
+
+namespace PR28047 {
+void test1(int i) {
+ try {
+ } catch (int(*)[i]) { // expected-error{{cannot catch variably modified type}}
+ }
+}
+void test2() {
+ int i;
+ try {
+ } catch (int(*)[i]) { // expected-error{{cannot catch variably modified type}}
+ }
+}
+}
OpenPOWER on IntegriCloud