From a83c016d229fafeac74e1dfb4938d322c3c0186e Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Sat, 22 Aug 2009 22:27:17 +0000 Subject: [PATCH] Type of a ?: expression whose either expression is a built-in 'id' type is 'id' type. llvm-svn: 79781 --- clang/lib/Sema/SemaExpr.cpp | 4 ++-- clang/test/SemaObjC/conditional-expr-5.m | 27 ++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 clang/test/SemaObjC/conditional-expr-5.m diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 15a3e40e3f27..f9ec6afc28d9 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -3213,9 +3213,9 @@ QualType Sema::CheckConditionalOperands(Expr *&Cond, Expr *&LHS, Expr *&RHS, // FIXME: Consider unifying with 'areComparableObjCPointerTypes'. // It could return the composite type. if (Context.canAssignObjCInterfaces(LHSOPT, RHSOPT)) { - compositeType = LHSTy; + compositeType = RHSOPT->isObjCBuiltinType() ? RHSTy : LHSTy; } else if (Context.canAssignObjCInterfaces(RHSOPT, LHSOPT)) { - compositeType = RHSTy; + compositeType = LHSOPT->isObjCBuiltinType() ? LHSTy : RHSTy; } else if ((LHSTy->isObjCQualifiedIdType() || RHSTy->isObjCQualifiedIdType()) && Context.ObjCQualifiedIdTypesAreCompatible(LHSTy, RHSTy, true)) { diff --git a/clang/test/SemaObjC/conditional-expr-5.m b/clang/test/SemaObjC/conditional-expr-5.m new file mode 100644 index 000000000000..d9c1a9474fe7 --- /dev/null +++ b/clang/test/SemaObjC/conditional-expr-5.m @@ -0,0 +1,27 @@ +// RUN: clang-cc -fsyntax-only -verify %s + +@interface PBXBuildSettingsDictionary +{ + int i; +} +@end + +@interface XCConditionalBuildSettingsDictionary : PBXBuildSettingsDictionary +{ +} +@end + +@implementation PBXBuildSettingsDictionary + +- (XCConditionalBuildSettingsDictionary *)conditionalDictionaryForConditionSet +{ + return i ? self : (id)0; +} + +- (XCConditionalBuildSettingsDictionary *)conditionalDictionaryForConditionSet2 +{ + return i ? (id)0 : self; +} +@end + +