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 you can use an unnamed argument with @catch.  This test is the same
6   as exceptions-3.mm, but with no name for @catch arguments.  */
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
21typedef MyObject MyObjectTypedef;
22typedef MyObject *MyObjectPtrTypedef;
23typedef int intTypedef;
24
25int test (id object)
26{
27  int dummy = 0;
28
29  @try { @throw object; }
30  @catch (int)          /* { dg-error "@catch parameter is not a known Objective-C class type" } */
31    {
32      dummy++;
33    }
34
35  @try { @throw object; }
36  @catch (intTypedef)   /* { dg-error "@catch parameter is not a known Objective-C class type" } */
37    {
38      dummy++;
39    }
40
41  @try { @throw object; }
42  @catch (int *)         /* { dg-error "@catch parameter is not a known Objective-C class type" } */
43    {
44      dummy++;
45    }
46
47  @try { @throw object; }
48  @catch (id)           /* Ok */
49    {
50      dummy++;
51    }
52
53  @try { @throw object; }
54  @catch (id <MyProtocol>) /* { dg-error "@catch parameter can not be protocol-qualified" } */
55    {
56      dummy++;
57    }
58
59  @try { @throw object; }
60  @catch (MyObject *)    /* Ok */
61    {
62      dummy++;
63    }
64
65  @try { @throw object; }
66  @catch (MyObject <MyProtocol> *)  /* { dg-error "@catch parameter can not be protocol-qualified" } */
67    {
68      dummy++;
69    }
70
71  @try { @throw object; }
72  @catch (MyObject)     /* { 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
77  @try { @throw object; }
78  @catch (static MyObject *) /* { dg-error "storage class" } */
79    {
80      dummy++;
81    }
82
83  @try { @throw object; }
84  @catch (MyObjectTypedef *) /* Ok */
85    {
86      dummy++;
87    }
88
89  @try { @throw object; }
90  @catch (MyObjectTypedef <MyProtocol> *) /* { dg-error "@catch parameter can not be protocol-qualified" } */
91    {
92      dummy++;
93    }
94
95  @try { @throw object; }
96  @catch (MyObjectPtrTypedef) /* Ok */
97    {
98      dummy++;
99    }
100
101  @try { @throw object; }
102  @catch (Class)   /* { dg-error "@catch parameter is not a known Objective-C class type" } */
103    {
104      dummy++;
105    }
106
107  @try { @throw object; }
108  @catch (...)            /* Ok */
109    {
110      dummy++;
111    }
112
113  return dummy;
114}
115