xref: /aosp_15_r20/external/clang/test/SemaObjCXX/cstyle-block-pointer-cast.mm (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li// RUN: %clang_cc1 -fsyntax-only -verify -fblocks -Wno-objc-root-class %s
2*67e74705SXin Li// radar 7562285
3*67e74705SXin Li
4*67e74705SXin Litypedef int (^blocktype)(int a, int b);
5*67e74705SXin Li
6*67e74705SXin Li@interface A {
7*67e74705SXin Li    A* a;
8*67e74705SXin Li    id b;
9*67e74705SXin Li    Class c;
10*67e74705SXin Li}
11*67e74705SXin Li- (blocktype)Meth;
12*67e74705SXin Li@end
13*67e74705SXin Li
14*67e74705SXin Li@implementation A
15*67e74705SXin Li- (blocktype)Meth {
16*67e74705SXin Li        if (b)
17*67e74705SXin Li	  return (blocktype)b;
18*67e74705SXin Li        else if (a)
19*67e74705SXin Li          return (blocktype)a; // expected-error {{C-style cast from 'A *' to 'blocktype' (aka 'int (^)(int, int)') is not allowed}}
20*67e74705SXin Li        else
21*67e74705SXin Li          return (blocktype)c;
22*67e74705SXin Li}
23*67e74705SXin Li@end
24*67e74705SXin Li
25*67e74705SXin Li@interface B {
26*67e74705SXin Li    blocktype a;
27*67e74705SXin Li    blocktype b;
28*67e74705SXin Li    blocktype c;
29*67e74705SXin Li}
30*67e74705SXin Li- (id)Meth;
31*67e74705SXin Li@end
32*67e74705SXin Li
33*67e74705SXin Li@implementation B
34*67e74705SXin Li- (id)Meth {
35*67e74705SXin Li        if (a)
36*67e74705SXin Li          return (A*)a; // expected-error {{C-style cast from 'blocktype' (aka 'int (^)(int, int)') to 'A *' is not allowed}}
37*67e74705SXin Li        if (b)
38*67e74705SXin Li	  return (id)b;
39*67e74705SXin Li        if (c)
40*67e74705SXin Li	  return (Class)b;
41*67e74705SXin Li}
42*67e74705SXin Li@end
43