1 // RUN: %clang_cc1 %s -fblocks -fsyntax-only -Wcast-function-type -verify=expected,strict
2 // RUN: %clang_cc1 %s -fblocks -fsyntax-only -Wcast-function-type-strict -verify=expected,strict
3 // RUN: %clang_cc1 %s -fblocks -fsyntax-only -Wextra -verify
7 typedef int (f1
)(long);
8 typedef int (f2
)(void*);
10 typedef void (f4
)(...);
11 typedef void (f5
)(void);
12 typedef int (f6
)(long, int);
13 typedef int (f7
)(long,...);
14 typedef int (&f8
)(long, int);
30 typedef void (S::*mf
)(int);
35 // Produce the underlying `long` type implicitly.
36 enum E2
{ big
= __LONG_MAX__
};
41 a
= (f1
*)efunc
; // strict-warning {{cast from 'int (*)(E)' to 'f1 *' (aka 'int (*)(long)') converts to incompatible function type}}
42 a
= (f1
*)e2func
; // strict-warning {{cast from 'int (*)(E2)' to 'f1 *' (aka 'int (*)(long)') converts to incompatible function type}}
43 b
= (f2
*)x
; // expected-warning {{cast from 'int (*)(long)' to 'f2 *' (aka 'int (*)(void *)') converts to incompatible function type}}
44 b
= reinterpret_cast<f2
*>(x
); // expected-warning {{cast from 'int (*)(long)' to 'f2 *' (aka 'int (*)(void *)') converts to incompatible function type}}
45 c
= (f3
*)x
; // strict-warning {{cast from 'int (*)(long)' to 'f3 *' (aka 'int (*)(...)') converts to incompatible function type}}
46 d
= (f4
*)x
; // expected-warning {{cast from 'int (*)(long)' to 'f4 *' (aka 'void (*)(...)') converts to incompatible function type}}
47 e
= (f5
*)x
; // strict-warning {{cast from 'int (*)(long)' to 'f5 *' (aka 'void (*)()') converts to incompatible function type}}
48 f
= (f6
*)x
; // expected-warning {{cast from 'int (*)(long)' to 'f6 *' (aka 'int (*)(long, int)') converts to incompatible function type}}
49 g
= (f7
*)x
; // strict-warning {{cast from 'int (*)(long)' to 'f7 *' (aka 'int (*)(long, ...)') converts to incompatible function type}}
51 mf p1
= (mf
)&S::foo
; // expected-warning {{cast from 'void (S::*)(int *)' to 'mf' (aka 'void (S::*)(int)') converts to incompatible function type}}
53 f8 f2
= (f8
)x
; // expected-warning {{cast from 'int (long)' to 'f8' (aka 'int (&)(long, int)') converts to incompatible function type}}
57 f
= (f6
*)y
; // expected-warning {{cast from 'int (^)(long)' to 'f6 *' (aka 'int (*)(long, int)') converts to incompatible function type}}