]>
Commit | Line | Data |
---|---|---|
b2e61dde MS |
1 | /* Process the ObjC-specific declarations and variables for |
2 | the Objective-C++ compiler. | |
a5544970 | 3 | Copyright (C) 2005-2019 Free Software Foundation, Inc. |
b2e61dde MS |
4 | Contributed by Ziemowit Laski <zlaski@apple.com> |
5 | ||
6 | This file is part of GCC. | |
7 | ||
8 | GCC is free software; you can redistribute it and/or modify it under | |
9 | the terms of the GNU General Public License as published by the Free | |
af84f9c5 | 10 | Software Foundation; either version 3, or (at your option) any later |
b2e61dde MS |
11 | version. |
12 | ||
13 | GCC is distributed in the hope that it will be useful, but WITHOUT ANY | |
14 | WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
15 | FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
16 | for more details. | |
17 | ||
18 | You should have received a copy of the GNU General Public License | |
af84f9c5 NC |
19 | along with GCC; see the file COPYING3. If not see |
20 | <http://www.gnu.org/licenses/>. */ | |
b2e61dde MS |
21 | |
22 | #include "config.h" | |
23 | #include "system.h" | |
24 | #include "coretypes.h" | |
b2e61dde | 25 | #include "cp-tree.h" |
b2e61dde | 26 | |
61d3ce20 | 27 | #include "c-family/c-objc.h" |
b2e61dde MS |
28 | #include "objcp-decl.h" |
29 | ||
30 | /* Hacks to simulate start_struct() and finish_struct(). */ | |
31 | ||
32 | tree | |
c2255bc4 AH |
33 | objcp_start_struct (location_t loc ATTRIBUTE_UNUSED, |
34 | enum tree_code code ATTRIBUTE_UNUSED, tree name) | |
b2e61dde MS |
35 | { |
36 | tree s; | |
37 | /* The idea here is to mimic the actions that the C++ parser takes when | |
38 | constructing 'extern "C" struct NAME {'. */ | |
39 | push_lang_context (lang_name_c); | |
18d311d8 | 40 | |
b2e61dde MS |
41 | if (!name) |
42 | name = make_anon_name (); | |
18d311d8 ZL |
43 | |
44 | s = xref_tag (record_type, name, ts_global, 0); | |
b2e61dde MS |
45 | CLASSTYPE_DECLARED_CLASS (s) = 0; /* this is a 'struct', not a 'class'. */ |
46 | xref_basetypes (s, NULL_TREE); /* no base classes here! */ | |
47 | ||
e3c888eb | 48 | return begin_class_definition (s); |
b2e61dde MS |
49 | } |
50 | ||
51 | tree | |
c2255bc4 AH |
52 | objcp_finish_struct (location_t loc ATTRIBUTE_UNUSED, |
53 | tree t, tree fieldlist, tree attributes) | |
b2e61dde MS |
54 | { |
55 | tree field, next_field; | |
56 | ||
57 | for (field = fieldlist; field; field = next_field) | |
58 | { | |
59 | next_field = TREE_CHAIN (field); /* insert one field at a time; */ | |
60 | TREE_CHAIN (field) = NULL_TREE; /* otherwise, grokfield croaks. */ | |
61 | finish_member_declaration (field); | |
62 | } | |
63 | t = finish_struct (t, attributes); | |
c0c24aa4 NP |
64 | |
65 | /* If we are inside an @interface and are generating the list of | |
66 | ivars, we need to check for duplicate ivars. | |
67 | */ | |
68 | if (fieldlist) | |
0dc33c3c | 69 | objc_detect_field_duplicates (true); |
c0c24aa4 | 70 | |
b2e61dde MS |
71 | pop_lang_context (); |
72 | ||
73 | return t; | |
74 | } | |
75 | ||
76 | void | |
77 | objcp_finish_function (void) | |
78 | { | |
79 | /* The C++ flavor of 'finish_function' does not generate RTL -- one has | |
80 | to call 'expand_or_defer_fn' to do that. */ | |
81 | expand_or_defer_fn (finish_function (0)); | |
82 | } | |
83 | ||
b2e61dde MS |
84 | tree |
85 | objcp_xref_tag (enum tree_code code ATTRIBUTE_UNUSED, tree name) | |
86 | { | |
18d311d8 | 87 | return xref_tag (record_type, name, ts_global, false); |
b2e61dde MS |
88 | } |
89 | ||
90 | int | |
91 | objcp_comptypes (tree type1, tree type2) | |
92 | { | |
96d84882 | 93 | return comptypes (type1, type2, COMPARE_STRICT); |
b2e61dde MS |
94 | } |
95 | ||
96 | tree | |
97 | objcp_begin_compound_stmt (int flags ATTRIBUTE_UNUSED) | |
98 | { | |
99 | return begin_compound_stmt (0); | |
100 | } | |
101 | ||
102 | tree | |
103 | objcp_end_compound_stmt (tree stmt, int flags ATTRIBUTE_UNUSED) | |
104 | { | |
105 | /* The following has been snarfed from | |
106 | cp/semantics.c:finish_compound_stmt(). */ | |
107 | if (TREE_CODE (stmt) == BIND_EXPR) | |
108 | BIND_EXPR_BODY (stmt) = do_poplevel (BIND_EXPR_BODY (stmt)); | |
109 | else if (STATEMENT_LIST_NO_SCOPE (stmt)) | |
110 | stmt = pop_stmt_list (stmt); | |
111 | else | |
112 | stmt = do_poplevel (stmt); | |
113 | ||
114 | return stmt; | |
115 | } |