зеркало из https://github.com/microsoft/clang.git
Don't allow catch declarations to name an abstract class
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@70248 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
972041f45b
Коммит
fef9f59e80
|
@ -2577,6 +2577,11 @@ Sema::DeclPtrTy Sema::ActOnExceptionDeclarator(Scope *S, Declarator &D) {
|
|||
RequireCompleteType(Begin, BaseType, DK))
|
||||
Invalid = true;
|
||||
|
||||
if (!Invalid && RequireNonAbstractType(Begin, ExDeclType,
|
||||
diag::err_abstract_type_in_decl,
|
||||
AbstractVariableType))
|
||||
Invalid = true;
|
||||
|
||||
// FIXME: Need to test for ability to copy-construct and destroy the
|
||||
// exception variable.
|
||||
// FIXME: Need to check for abstract classes.
|
||||
|
|
|
@ -2,6 +2,8 @@
|
|||
|
||||
struct A; // expected-note 4 {{forward declaration of 'struct A'}}
|
||||
|
||||
struct Abstract { virtual void f() = 0; }; // expected-note {{pure virtual function 'f'}}
|
||||
|
||||
void trys() {
|
||||
try {
|
||||
} catch(int i) { // expected-note {{previous definition}}
|
||||
|
@ -12,6 +14,7 @@ void trys() {
|
|||
} catch(A a) { // expected-error {{cannot catch incomplete type 'struct A'}}
|
||||
} catch(A *a) { // expected-error {{cannot catch pointer to incomplete type 'struct A'}}
|
||||
} catch(A &a) { // expected-error {{cannot catch reference to incomplete type 'struct A'}}
|
||||
} catch(Abstract) { // expected-error {{variable type 'Abstract' is an abstract class}}
|
||||
} catch(...) {
|
||||
int j = i; // expected-error {{use of undeclared identifier 'i'}}
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче