xref: /aosp_15_r20/external/clang/test/CodeGenObjCXX/message.mm (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li// RUN: %clang_cc1 -x objective-c++ -triple x86_64-apple-darwin10 -fobjc-runtime=macosx-10.7 -emit-llvm -o - %s | FileCheck %s
2*67e74705SXin Li
3*67e74705SXin Li// Properly instantiate a non-dependent message expression which
4*67e74705SXin Li// requires a contextual conversion to ObjC pointer type.
5*67e74705SXin Li// <rdar://13305374>
6*67e74705SXin Li@interface Test0
7*67e74705SXin Li- (void) foo;
8*67e74705SXin Li@end
9*67e74705SXin Linamespace test0 {
10*67e74705SXin Li  struct A {
11*67e74705SXin Li    operator Test0*();
12*67e74705SXin Li  };
13*67e74705SXin Li  template <class T> void foo() {
14*67e74705SXin Li    A a;
15*67e74705SXin Li    [a foo];
16*67e74705SXin Li  }
17*67e74705SXin Li  template void foo<int>();
18*67e74705SXin Li  // CHECK-LABEL:    define weak_odr void @_ZN5test03fooIiEEvv()
19*67e74705SXin Li  // CHECK:      [[T0:%.*]] = call [[TEST0:%.*]]* @_ZN5test01AcvP5Test0Ev(
20*67e74705SXin Li  // CHECK-NEXT: [[T1:%.*]] = load i8*, i8**
21*67e74705SXin Li  // CHECK-NEXT: [[T2:%.*]] = bitcast [[TEST0]]* [[T0]] to i8*
22*67e74705SXin Li  // CHECK-NEXT: call void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*)*)(i8* [[T2]], i8* [[T1]])
23*67e74705SXin Li  // CHECK-NEXT: ret void
24*67e74705SXin Li}
25