Index: lib/Sema/SemaExpr.cpp =================================================================== --- lib/Sema/SemaExpr.cpp +++ lib/Sema/SemaExpr.cpp @@ -6492,13 +6492,11 @@ // Thus for conditional operator we merge CVR and address space unqualified // pointees and if there is a composite type we return a pointer to it with // merged qualifiers. + LHSCastKind = + LAddrSpace == ResultAddrSpace ? CK_BitCast : CK_AddressSpaceConversion; + RHSCastKind = + RAddrSpace == ResultAddrSpace ? CK_BitCast : CK_AddressSpaceConversion; if (S.getLangOpts().OpenCL) { - LHSCastKind = LAddrSpace == ResultAddrSpace - ? CK_BitCast - : CK_AddressSpaceConversion; - RHSCastKind = RAddrSpace == ResultAddrSpace - ? CK_BitCast - : CK_AddressSpaceConversion; lhQual.removeAddressSpace(); rhQual.removeAddressSpace(); } Index: test/Sema/address_spaces_cond_op.c =================================================================== --- /dev/null +++ test/Sema/address_spaces_cond_op.c @@ -0,0 +1,16 @@ +// RUN: %clang_cc1 -ast-dump %s | FileCheck %s + +#define _AS1 __attribute__((address_space(1))) +#define _AS2 __attribute__((address_space(2))) + +char *cmp(_AS1 char *x, _AS2 char *y) { + return x < y ? x : y; +} + +// CHECK: |-ImplicitCastExpr {{.*}} 'void *' +// CHECK-NEXT: | `-ImplicitCastExpr {{.*}} '__attribute__((address_space(1))) char *' +// CHECK-NEXT: | `-DeclRefExpr {{.*}} '__attribute__((address_space(1))) char *' {{.*}} 'x' '__attribute__((address_space(1))) char *' + +// CHECK: `-ImplicitCastExpr {{.*}} 'void *' +// CHECK-NEXT: `-ImplicitCastExpr {{.*}} '__attribute__((address_space(2))) char *' +// CHECK-NEXT: `-DeclRefExpr {{.*}} '__attribute__((address_space(2))) char *' {{.*}} 'y' '__attribute__((address_space(2))) char *' Index: test/Sema/address_spaces_cond_op_ir.c =================================================================== --- /dev/null +++ test/Sema/address_spaces_cond_op_ir.c @@ -0,0 +1,16 @@ +// RUN: %clang_cc1 -S -emit-llvm -o - %s | FileCheck %s + +#define _AS1 __attribute__((address_space(1))) +#define _AS2 __attribute__((address_space(2))) + +char *cmp(_AS1 char *x, _AS2 char *y) { + return x < y ? x : y; +} + +// CHECK: %x.addr = alloca i8 addrspace(1)*, align 8 +// CHECK-NEXT: %y.addr = alloca i8 addrspace(2)*, align 8 +// CHECK-NEXT: store i8 addrspace(1)* %x, i8 addrspace(1)** %x.addr, align 8 +// CHECK-NEXT: store i8 addrspace(2)* %y, i8 addrspace(2)** %y.addr, align 8 +// CHECK-NEXT: %0 = load i8 addrspace(1)*, i8 addrspace(1)** %x.addr, align 8 +// CHECK-NEXT: %1 = load i8 addrspace(2)*, i8 addrspace(2)** %y.addr, align 8 +// CHECK-NEXT: %2 = addrspacecast i8 addrspace(2)* %1 to i8 addrspace(1)*