| // RUN: %clang_cc1 -triple x86_64-apple-darwin -std=c++11 -emit-llvm %s -o - | \ | 
 | // RUN: FileCheck %s | 
 | // RUN: %clang_cc1 -triple i386-apple-darwin -std=c++11 -emit-llvm %s -o - | \ | 
 | // RUN: FileCheck %s | 
 |  | 
 | extern "C" int printf(...); | 
 |  | 
 | int f1(int arg)  { return arg; };  | 
 |  | 
 | int f2(float arg) { return int(arg); };  | 
 |  | 
 | typedef int (*fp1)(int);  | 
 |  | 
 | typedef int (*fp2)(float);  | 
 |  | 
 | struct A { | 
 |   operator fp1() { return f1; } | 
 |   operator fp2() { return f2; }  | 
 | } a; | 
 |  | 
 |  | 
 | // Test for function reference. | 
 | typedef int (&fr1)(int);  | 
 | typedef int (&fr2)(float);  | 
 |  | 
 | struct B { | 
 |   operator fr1() { return f1; } | 
 |   operator fr2() { return f2; }  | 
 | } b; | 
 |  | 
 | int main() | 
 | { | 
 |  int i = a(10); // Calls f1 via pointer returned from conversion function | 
 |  printf("i = %d\n", i); | 
 |  | 
 |  int j = b(20); // Calls f1 via pointer returned from conversion function | 
 |  printf("j = %d\n", j); | 
 |  return 0; | 
 | } | 
 |  | 
 | // CHECK: call i32 (i32)* @_ZN1AcvPFiiEEv | 
 | // CHECK: call i32 (i32)* @_ZN1BcvRFiiEEv |