[cfe-commits] r64308 - in /cfe/trunk: include/clang/Basic/DiagnosticSemaKinds.def lib/Sema/SemaStmt.cpp test/Parser/objc-try-catch-1.m test/SemaObjC/try-catch.m

steve naroff snaroff at apple.com
Wed Feb 11 10:30:23 PST 2009


On Feb 11, 2009, at 1:15 PM, Chris Lattner wrote:

> On Feb 11, 2009, at 9:45 AM, Steve Naroff wrote:
>> Log:
>> Fix <rdar://problem/6206858> [sema] type check @throw statements.
>>
>
> Thanks!
>
>> +Sema::ActOnObjCAtThrowStmt(SourceLocation AtLoc, ExprArg expr) {
>> +  Expr *ThrowExpr = static_cast<Expr*>(expr.release());
>> +  if (!ThrowExpr) {
>> +    // FIXME: verify the 'rethrow' is within a @catch block
>> +  } else {
>> +    QualType ThrowType = ThrowExpr->getType();
>> +    // Make sure the expression type is an ObjC pointer or "void *".
>> +    if (!Context.isObjCObjectPointerType(ThrowType)) {
>> +      const PointerType *PT = ThrowType->getAsPointerType();
>> +      if (!PT || !PT->getPointeeType()->isVoidType())
>> +        // This should be an error, however GCC only yields a  
>> warning.
>> +        Diag(AtLoc, diag::warn_objc_throw_expects_object)
>> +                    << ThrowExpr->getType() << ThrowExpr- 
>> >getSourceRange();
>
>
> Shouldn't this reject aggregates with an error?
>

I'd prefer we make this an error for all cases (rather than a mix of  
errors/warnings).

GCC's "implicit" diagnostics (based on the underlying function call/ 
ABI) seem like a poor model for clang to follow (in retrospect).

What do you think?

snaroff

Here is a small test case below (with clang/gcc output).

[steve-naroffs-macbook-pro:~/llvm/tools/clang] snaroffBook% ../../ 
Debug/bin/clang throw.m
throw.m:5:3: warning: invalid 'int' argument (expected an ObjC object  
type)
   @throw 42;
   ^      ~~
throw.m:6:3: warning: invalid 'struct s' argument (expected an ObjC  
object type)
   @throw agg;
   ^      ~~~
throw.m:7:3: warning: invalid 'struct s *' argument (expected an ObjC  
object type)
   @throw pagg;
   ^      ~~~~
3 diagnostics generated.
[steve-naroffs-macbook-pro:~/llvm/tools/clang] snaroffBook% cc -c  
throw.m
throw.m: In function ‘foo’:
throw.m:5: warning: passing argument 1 of ‘objc_exception_throw’ makes  
pointer from integer without a cast
throw.m:6: error: incompatible type for argument 1 of  
‘objc_exception_throw’
throw.m:7: warning: passing argument 1 of ‘objc_exception_throw’ from  
incompatible pointer type
[steve-naroffs-macbook-pro:~/llvm/tools/clang] snaroffBook% cat throw.m

int foo() {
   struct s { int a, b; } agg, *pagg;

   @throw 42;
   @throw agg;
   @throw pagg;
}

> -Chris





More information about the cfe-commits mailing list