diff options
author | Mike Stump <mrs@gcc.gnu.org> | 1995-10-23 22:25:44 +0000 |
---|---|---|
committer | Mike Stump <mrs@gcc.gnu.org> | 1995-10-23 22:25:44 +0000 |
commit | ebfc180f46036e2505997f5fbee93f716e5259d9 (patch) | |
tree | 7085db60bb4bf83f64810c563cf46ce3e6ef77c8 | |
parent | c77bb813b842a4cb611f88a8eb22ffe6daca8b9d (diff) | |
download | gcc-ebfc180f46036e2505997f5fbee93f716e5259d9.zip gcc-ebfc180f46036e2505997f5fbee93f716e5259d9.tar.gz gcc-ebfc180f46036e2505997f5fbee93f716e5259d9.tar.bz2 |
FSF local junk
From-SVN: r10508
-rw-r--r-- | gcc/cp/decl.c | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index b0453b6..103cb0d 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -12782,3 +12782,97 @@ pop_cp_function_context (context) free (p); } + +/* FSF LOCAL dje prefix attributes */ +/* Split SPECS_ATTRS, a list of declspecs and prefix attributes, into two + lists. SPECS_ATTRS may also be just a typespec (eg: RECORD_TYPE). + + The head of the declspec list is stored in DECLSPECS. + The head of the attribute list is stored in PREFIX_ATTRIBUTES. + + Note that attributes in SPECS_ATTRS are stored in the TREE_PURPOSE of + the list elements. We drop the containing TREE_LIST nodes and link the + resulting attributes together the way decl_attributes expects them. */ + +void +split_specs_attrs (specs_attrs, declspecs, prefix_attributes) + tree specs_attrs; + tree *declspecs, *prefix_attributes; +{ + tree t, s, a, next, specs, attrs; + + /* This can happen in c++ (eg: decl: typespec initdecls ';'). */ + if (specs_attrs != NULL_TREE + && TREE_CODE (specs_attrs) != TREE_LIST) + { + *declspecs = specs_attrs; + *prefix_attributes = NULL_TREE; + return; + } + + /* Remember to keep the lists in the same order, element-wise. */ + + specs = s = NULL_TREE; + attrs = a = NULL_TREE; + for (t = specs_attrs; t; t = next) + { + next = TREE_CHAIN (t); + /* Declspecs have a non-NULL TREE_VALUE. */ + if (TREE_VALUE (t) != NULL_TREE) + { + if (specs == NULL_TREE) + specs = s = t; + else + { + TREE_CHAIN (s) = t; + s = t; + } + } + else + { + if (attrs == NULL_TREE) + attrs = a = TREE_PURPOSE (t); + else + { + TREE_CHAIN (a) = TREE_PURPOSE (t); + a = TREE_PURPOSE (t); + } + } + } + + /* Terminate the lists. */ + if (s != NULL_TREE) + TREE_CHAIN (s) = NULL_TREE; + if (a != NULL_TREE) + TREE_CHAIN (a) = NULL_TREE; + + /* All done. */ + *declspecs = specs; + *prefix_attributes = attrs; +} + +/* Strip attributes from SPECS_ATTRS, a list of declspecs and attributes. + This function is used by the parser when a rule will accept attributes + in a particular position, but we don't want to support that just yet. + + A warning is issued for every ignored attribute. */ + +tree +strip_attrs (specs_attrs) + tree specs_attrs; +{ + tree specs, attrs; + + split_specs_attrs (specs_attrs, &specs, &attrs); + + while (attrs) + { + warning ("`%s' attribute ignored", + IDENTIFIER_POINTER (TREE_PURPOSE (attrs))); + attrs = TREE_CHAIN (attrs); + } + + return specs; +} +/* END FSF LOCAL */ + |