]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/testsuite/obj-c++.dg/exceptions-3.mm
90a657c8d7046fcb3c2dfa2872c75e26b38b0bf7
[thirdparty/gcc.git] / gcc / testsuite / obj-c++.dg / exceptions-3.mm
1 /* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, November 2010. */
2 /* { dg-options "-fobjc-exceptions" } */
3 /* { dg-do compile } */
4
5 /* Test that the compiler is checking the argument of @catch(), and
6 produce errors when invalid types are used. */
7
8 #include <objc/objc.h>
9
10 @interface MyObject
11 {
12 Class isa;
13 } /* { dg-line interface_MyObject } */
14 @end
15
16 @implementation MyObject
17 @end
18
19 @protocol MyProtocol;
20
21 typedef MyObject MyObjectTypedef;
22 typedef MyObject *MyObjectPtrTypedef;
23 typedef int intTypedef;
24
25 int test (id object)
26 {
27 int dummy = 0;
28
29 @try { @throw object; }
30 @catch (int x) /* { dg-error "@catch parameter is not a known Objective-C class type" } */
31 {
32 dummy++;
33 }
34
35 @try { @throw object; }
36 @catch (intTypedef x) /* { dg-error "@catch parameter is not a known Objective-C class type" } */
37 {
38 dummy++;
39 }
40
41 @try { @throw object; }
42 @catch (int *x) /* { dg-error "@catch parameter is not a known Objective-C class type" } */
43 {
44 dummy++;
45 }
46
47 @try { @throw object; }
48 @catch (id x) /* Ok */
49 {
50 dummy++;
51 }
52
53 @try { @throw object; }
54 @catch (id <MyProtocol> x) /* { dg-error "@catch parameter cannot be protocol-qualified" } */
55 {
56 dummy++;
57 }
58
59 @try { @throw object; }
60 @catch (MyObject *x) /* Ok */
61 {
62 dummy++;
63 }
64
65 @try { @throw object; }
66 @catch (MyObject <MyProtocol> *x) /* { dg-error "@catch parameter cannot be protocol-qualified" } */
67 {
68 dummy++;
69 }
70
71 @try { @throw object; }
72 @catch (MyObject x) /* { dg-error "@catch parameter is not a known Objective-C class type" } */
73 { /* { dg-error "no matching function" "" { target *-*-* } .-1 } */
74 dummy++; /* { dg-message "MyObject" "" { target *-*-* } interface_MyObject } */
75 } /* { dg-message "candidate" "" { target *-*-* } interface_MyObject } */
76 @try { @throw object; }
77 @catch (static MyObject *x) /* { dg-error "storage class" } */
78 {
79 dummy++;
80 }
81
82 @try { @throw object; }
83 @catch (MyObjectTypedef *x) /* Ok */
84 {
85 dummy++;
86 }
87
88 @try { @throw object; }
89 @catch (MyObjectTypedef <MyProtocol> *x) /* { dg-error "@catch parameter cannot be protocol-qualified" } */
90 {
91 dummy++;
92 }
93
94 @try { @throw object; }
95 @catch (MyObjectPtrTypedef x) /* Ok */
96 {
97 dummy++;
98 }
99
100 @try { @throw object; }
101 @catch (Class x) /* { dg-error "@catch parameter is not a known Objective-C class type" } */
102 {
103 dummy++;
104 }
105
106 @try { @throw object; }
107 @catch (...) /* Ok */
108 {
109 dummy++;
110 }
111
112 return dummy;
113 }