From: Fariborz Jahanian Date: Tue, 20 Apr 2010 20:28:15 +0000 (+0000) Subject: Patch to support transparent_union types on X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b00ab27f64abd18a68fc41699b86d0bc36189e21;p=clang Patch to support transparent_union types on objective-c methods. Fixes radar 7875968. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@101935 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaExprObjC.cpp b/lib/Sema/SemaExprObjC.cpp index ce06abec4d..1feca6d25c 100644 --- a/lib/Sema/SemaExprObjC.cpp +++ b/lib/Sema/SemaExprObjC.cpp @@ -216,6 +216,11 @@ bool Sema::CheckMessageArgumentTypes(Expr **Args, unsigned NumArgs, AssignConvertType Result = CheckSingleAssignmentConstraints(lhsType, argExpr); + if (Result == Incompatible && !getLangOptions().CPlusPlus && + CheckTransparentUnionArgumentConstraints(lhsType, argExpr) + == Sema::Compatible) + Result = Compatible; + if (Args[i] != argExpr) // The expression was converted. Args[i] = argExpr; // Make sure we store the converted expression. diff --git a/test/SemaObjC/transparent-union.m b/test/SemaObjC/transparent-union.m new file mode 100644 index 0000000000..cb03dfec35 --- /dev/null +++ b/test/SemaObjC/transparent-union.m @@ -0,0 +1,22 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s + +typedef union { + struct xx_object_s *_do; + struct xx_continuation_s *_dc; + struct xx_queue_s *_dq; + struct xx_queue_attr_s *_dqa; + struct xx_group_s *_dg; + struct xx_source_s *_ds; + struct xx_source_attr_s *_dsa; + struct xx_semaphore_s *_dsema; +} xx_object_t __attribute__((transparent_union)); + +@interface INTF +- (void) doSomething : (xx_object_t) xxObject; +- (void)testMeth; +@end + +@implementation INTF +- (void) doSomething : (xx_object_t) xxObject {} +- (void)testMeth { struct xx_queue_s *sq; [self doSomething:sq ]; } +@end