From f43f12278dd660b88a77ce56098204f133de8ec9 Mon Sep 17 00:00:00 2001 From: David Majnemer <david.majnemer@gmail.com> Date: Wed, 8 Jun 2016 16:05:07 +0000 Subject: [PATCH] [Sema] Don't permit catching variably modified types Variably modified types shouldn't be permitted in catch clauses. This fixes PR28047. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@272159 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Basic/DiagnosticSemaKinds.td | 2 ++ lib/Sema/SemaDeclCXX.cpp | 5 +++++ test/SemaCXX/exceptions.cpp | 14 ++++++++++++++ 3 files changed, 21 insertions(+) diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index 9789609d5ad..1813544a78c 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/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/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index 8212bd4db3f..1ab3fb2ab86 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/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/test/SemaCXX/exceptions.cpp b/test/SemaCXX/exceptions.cpp index 05793e2ffc8..9e76783ca8a 100644 --- a/test/SemaCXX/exceptions.cpp +++ b/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}} + } +} +} -- GitLab