Fix <rdar://problem/6252237> [sema] qualified id should be disallowed in @catch statements.

llvm-svn: 65969
This commit is contained in:
Steve Naroff 2009-03-03 21:16:54 +00:00
parent 39d6fba0d6
commit 27ed6f6766
3 changed files with 13 additions and 3 deletions
clang
include/clang/Basic
lib/Sema
test/SemaObjC

View File

@ -962,6 +962,8 @@ DIAG(err_attribute_multiple_objc_gc, ERROR,
"multiple garbage collection attributes specified for type") "multiple garbage collection attributes specified for type")
DIAG(err_catch_param_not_objc_type, ERROR, DIAG(err_catch_param_not_objc_type, ERROR,
"@catch parameter is not an Objective-C class type") "@catch parameter is not an Objective-C class type")
DIAG(warn_ignoring_qualifiers_on_catch_parm, WARNING,
"ignoring qualifiers on @catch parameter")
// C++ casts // C++ casts

View File

@ -968,9 +968,14 @@ Sema::ActOnObjCAtCatchStmt(SourceLocation AtLoc,
ParmVarDecl *PVD = static_cast<ParmVarDecl*>(Parm); ParmVarDecl *PVD = static_cast<ParmVarDecl*>(Parm);
// PVD == 0 implies @catch(...). // PVD == 0 implies @catch(...).
if (PVD && !Context.isObjCObjectPointerType(PVD->getType())) if (PVD) {
if (!Context.isObjCObjectPointerType(PVD->getType()))
return StmtError(Diag(PVD->getLocation(), return StmtError(Diag(PVD->getLocation(),
diag::err_catch_param_not_objc_type)); diag::err_catch_param_not_objc_type));
if (PVD->getType()->isObjCQualifiedIdType())
return StmtError(Diag(PVD->getLocation(),
diag::warn_ignoring_qualifiers_on_catch_parm));
}
ObjCAtCatchStmt *CS = new (Context) ObjCAtCatchStmt(AtLoc, RParen, ObjCAtCatchStmt *CS = new (Context) ObjCAtCatchStmt(AtLoc, RParen,
PVD, static_cast<Stmt*>(Body.release()), CatchList); PVD, static_cast<Stmt*>(Body.release()), CatchList);

View File

@ -1,10 +1,13 @@
// RUN: clang -verify %s // RUN: clang -verify %s
@protocol P;
void f() { void f() {
@try { @try {
} @catch (void a) { // expected-error{{@catch parameter is not an Objective-C class type}} } @catch (void a) { // expected-error{{@catch parameter is not an Objective-C class type}}
} @catch (int) { // expected-error{{@catch parameter is not an Objective-C class type}} } @catch (int) { // expected-error{{@catch parameter is not an Objective-C class type}}
} @catch (int *b) { // expected-error{{@catch parameter is not an Objective-C class type}} } @catch (int *b) { // expected-error{{@catch parameter is not an Objective-C class type}}
} @catch (id <P> c) { // expected-warning{{ignoring qualifiers on @catch parameter}}
} }
} }