diff options
-rw-r--r-- | lib/Sema/SemaExprObjC.cpp | 5 | ||||
-rw-r--r-- | test/SemaObjC/transparent-union.m | 22 |
2 files changed, 27 insertions, 0 deletions
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 |