// RUN: %clang_cc1 -fblocks -emit-llvm %s -o - -triple=i386-pc-win32 | FileCheck %s
;
;
typedef C<void> C0;
;
;
C0 callback_void;
// CHECK: "?callback_void@@3V?$C@$$A6AXXZ@@A"
volatile C0 callback_void_volatile;
// CHECK: "?callback_void_volatile@@3V?$C@$$A6AXXZ@@C"
;
C<int> callback_int;
// CHECK: "?callback_int@@3V?$C@$$A6AHXZ@@A"
C<Type> callback_Type;
// CHECK: "?callback_Type@@3V?$C@$$A6A?AVType@@XZ@@A"
C<void> callback_void_int;
// CHECK: "?callback_void_int@@3V?$C@$$A6AXH@Z@@A"
C<int> callback_int_int;
// CHECK: "?callback_int_int@@3V?$C@$$A6AHH@Z@@A"
C<void> callback_void_Type;
// CHECK: "?callback_void_Type@@3V?$C@$$A6AXVType@@@Z@@A"
void
// CHECK: "?foo@@YAXV?$C@$$A6AXXZ@@@Z"
// Here be dragons!
// Let's face the magic of template partial specialization...
void
// CHECK: "?function@@YAXV?$C@$$A6AXXZ@@@Z"
;
void
// CHECK: "?function_pointer@@YAXV?$C@P6AXXZ@@@Z"
// Block equivalent to the previous definitions.
;
void
// CHECK: "?block@@YAXV?$C@P_EAXXZ@@@Z"
// FYI blocks are not present in MSVS, so we're free to choose the spec.
;
;
void
// CHECK: "?member_pointer@@YAXV?$C@P8Z@@AEXXZ@@@Z"
void
void
void
void
;
void ;
void
// CHECK: call {{.*}} @"??$WrapFnPtr@$1?VoidFn@@YAXXZ@@YAXXZ"
// CHECK: call {{.*}} @"??$WrapFnRef@$1?VoidFn@@YAXXZ@@YAXXZ"
// CHECK: call {{.*}} @"??$WrapFnPtr@$1?VoidStaticMethod@Thing@@SAXXZ@@YAXXZ"
// CHECK: call {{.*}} @"??$WrapFnRef@$1?VoidStaticMethod@Thing@@SAXXZ@@YAXXZ"