#include "config.h"
#include "system.h"
#include "coretypes.h"
#include "tm.h"
#include "tree.h"
#include "rtl.h"
#include "expr.h"
#include "cp-tree.h"
#include "c-common.h"
#include "flags.h"
#include "input.h"
#include "except.h"
#include "output.h"
#include "toplev.h"
#include "cpplib.h"
#include "debug.h"
#include "target.h"
#include "varray.h"
#include "objc-act.h"
#include "objcp-decl.h"
tree
objcp_start_struct (enum tree_code code ATTRIBUTE_UNUSED, tree name)
{
tree s;
push_lang_context (lang_name_c);
if (!name)
name = make_anon_name ();
s = xref_tag (record_type, name, ts_global, 0);
CLASSTYPE_DECLARED_CLASS (s) = 0;
xref_basetypes (s, NULL_TREE);
return begin_class_definition (s, NULL_TREE);
}
tree
objcp_finish_struct (tree t, tree fieldlist, tree attributes)
{
tree field, next_field;
for (field = fieldlist; field; field = next_field)
{
next_field = TREE_CHAIN (field);
TREE_CHAIN (field) = NULL_TREE;
finish_member_declaration (field);
}
t = finish_struct (t, attributes);
field = fieldlist;
if (fieldlist && (fieldlist = objc_get_interface_ivars (fieldlist)) != field)
objc_detect_field_duplicates (fieldlist);
pop_lang_context ();
return t;
}
void
objcp_finish_function (void)
{
expand_or_defer_fn (finish_function (0));
}
tree
objcp_xref_tag (enum tree_code code ATTRIBUTE_UNUSED, tree name)
{
return xref_tag (record_type, name, ts_global, false);
}
int
objcp_comptypes (tree type1, tree type2)
{
return comptypes (type1, type2, COMPARE_STRICT);
}
tree
objcp_begin_compound_stmt (int flags ATTRIBUTE_UNUSED)
{
return begin_compound_stmt (0);
}
tree
objcp_end_compound_stmt (tree stmt, int flags ATTRIBUTE_UNUSED)
{
if (TREE_CODE (stmt) == BIND_EXPR)
BIND_EXPR_BODY (stmt) = do_poplevel (BIND_EXPR_BODY (stmt));
else if (STATEMENT_LIST_NO_SCOPE (stmt))
stmt = pop_stmt_list (stmt);
else
stmt = do_poplevel (stmt);
return stmt;
}