aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZack Weinberg <zackw@stanford.edu>2001-03-02 00:40:00 +0000
committerZack Weinberg <zack@gcc.gnu.org>2001-03-02 00:40:00 +0000
commit71b7be38c3f1d50ca004b3aa1c21e206d595c67f (patch)
treeb9429823f84096cf8932b11e6e31c6dd708dab5d
parent5aa709ad7e1cb28ae54dea521a5ca6cbf1fe6016 (diff)
downloadgcc-71b7be38c3f1d50ca004b3aa1c21e206d595c67f.zip
gcc-71b7be38c3f1d50ca004b3aa1c21e206d595c67f.tar.gz
gcc-71b7be38c3f1d50ca004b3aa1c21e206d595c67f.tar.bz2
stringpool.c (set_identifier): New function.
* stringpool.c (set_identifier): New function. * tree.h: Prototype it. * c-parse.in: Kill D_YES. If compiled for objc, call save_and_forget_protocol_qualifiers from init_reswords. * objc/objc-act.c (remember_protocol_qualifiers, forget_protocol_qualifiers): Don't diddle C_IS_RESERVED_WORD. Swap out the non-keyword IDENTIFIER_NODEs for keyword ones, or vice versa. (save_and_forget_protocol_qualifiers): New function. * c-lex.h: Prototype save_and_forget_protocol_qualifiers. From-SVN: r40170
-rw-r--r--gcc/ChangeLog14
-rw-r--r--gcc/c-lex.h1
-rw-r--r--gcc/c-parse.in23
-rw-r--r--gcc/objc/objc-act.c46
-rw-r--r--gcc/stringpool.c19
-rw-r--r--gcc/tree.h7
6 files changed, 84 insertions, 26 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index ee9f3d4..637efd3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,17 @@
+2001-03-01 Zack Weinberg <zackw@stanford.edu>
+
+ * stringpool.c (set_identifier): New function.
+ * tree.h: Prototype it.
+
+ * c-parse.in: Kill D_YES. If compiled for objc, call
+ save_and_forget_protocol_qualifiers from init_reswords.
+ * objc/objc-act.c (remember_protocol_qualifiers,
+ forget_protocol_qualifiers): Don't diddle C_IS_RESERVED_WORD.
+ Swap out the non-keyword IDENTIFIER_NODEs for keyword ones, or
+ vice versa.
+ (save_and_forget_protocol_qualifiers): New function.
+ * c-lex.h: Prototype save_and_forget_protocol_qualifiers.
+
2001-03-01 Diego Novillo <dnovillo@redhat.com>
* c-semantics.c (prune_unused_decls): Return error_mark_node
diff --git a/gcc/c-lex.h b/gcc/c-lex.h
index bfdc2ab..bd25a16 100644
--- a/gcc/c-lex.h
+++ b/gcc/c-lex.h
@@ -27,6 +27,7 @@ extern void position_after_white_space PARAMS ((void));
extern int c_lex PARAMS ((tree *));
extern const char *init_c_lex PARAMS ((const char *));
+extern void save_and_forget_protocol_qualifiers PARAMS ((void));
extern void forget_protocol_qualifiers PARAMS ((void));
extern void remember_protocol_qualifiers PARAMS ((void));
extern tree is_class_name PARAMS ((tree));
diff --git a/gcc/c-parse.in b/gcc/c-parse.in
index 4f1de58..ea59e73 100644
--- a/gcc/c-parse.in
+++ b/gcc/c-parse.in
@@ -2878,7 +2878,6 @@ struct resword
#define D_EXT 0x04 /* GCC extension */
#define D_EXT89 0x08 /* GCC extension incorporated in C99 */
#define D_OBJC 0x10 /* Objective C only */
-#define D_YES 0x20 /* always starts disabled */
static const struct resword reswords[] =
{
@@ -2971,12 +2970,12 @@ ifobjc
{ "@public", RID_AT_PUBLIC, D_OBJC },
{ "@selector", RID_AT_SELECTOR, D_OBJC },
{ "id", RID_ID, D_OBJC },
- { "bycopy", RID_BYCOPY, D_OBJC|D_YES },
- { "byref", RID_BYREF, D_OBJC|D_YES },
- { "in", RID_IN, D_OBJC|D_YES },
- { "inout", RID_INOUT, D_OBJC|D_YES },
- { "oneway", RID_ONEWAY, D_OBJC|D_YES },
- { "out", RID_OUT, D_OBJC|D_YES },
+ { "bycopy", RID_BYCOPY, D_OBJC },
+ { "byref", RID_BYREF, D_OBJC },
+ { "in", RID_IN, D_OBJC },
+ { "inout", RID_INOUT, D_OBJC },
+ { "oneway", RID_ONEWAY, D_OBJC },
+ { "out", RID_OUT, D_OBJC },
end ifobjc
};
#define N_reswords (sizeof reswords / sizeof (struct resword))
@@ -3138,14 +3137,12 @@ init_reswords ()
id = get_identifier (reswords[i].word);
C_RID_CODE (id) = reswords[i].rid;
+ C_IS_RESERVED_WORD (id) = 1;
ridpointers [(int) reswords[i].rid] = id;
-
- /* Objective C does tricky things with enabling and disabling
- keywords. So these we must not elide in the test above, but
- wait and not mark them reserved now. */
- if (! (reswords[i].disable & D_YES))
- C_IS_RESERVED_WORD (id) = 1;
}
+ifobjc
+ save_and_forget_protocol_qualifiers ();
+end ifobjc
}
const char *
diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c
index 8da5c6b..f5f27ad 100644
--- a/gcc/objc/objc-act.c
+++ b/gcc/objc/objc-act.c
@@ -8590,25 +8590,45 @@ lookup_objc_ivar (id)
return 0;
}
-/* Parser callbacks. */
+/* Parser callbacks.
+ Some ObjC keywords are reserved only in a particular context:
+ in out inout bycopy byref oneway.
+ We have to save and restore the IDENTIFIER_NODEs that describe
+ them as keywords, when appropriate. */
+
+#define N_PQ 6
+static tree saved_pq[N_PQ];
+static tree saved_not_pq[N_PQ];
+static const char *const pq_strings[N_PQ] = {
+ "bycopy", "byref", "in", "inout", "oneway", "out"
+};
+
+void
+save_and_forget_protocol_qualifiers ()
+{
+ int i;
+ for (i = 0; i < N_PQ; i++)
+ saved_pq[i] = set_identifier (pq_strings[i], NULL_TREE);
+
+ ggc_add_tree_root (saved_pq, N_PQ);
+ ggc_add_tree_root (saved_not_pq, N_PQ);
+}
+
void
forget_protocol_qualifiers ()
{
- C_IS_RESERVED_WORD (ridpointers[(int) RID_IN]) = 0;
- C_IS_RESERVED_WORD (ridpointers[(int) RID_OUT]) = 0;
- C_IS_RESERVED_WORD (ridpointers[(int) RID_INOUT]) = 0;
- C_IS_RESERVED_WORD (ridpointers[(int) RID_BYCOPY]) = 0;
- C_IS_RESERVED_WORD (ridpointers[(int) RID_BYREF]) = 0;
- C_IS_RESERVED_WORD (ridpointers[(int) RID_ONEWAY]) = 0;
+ int i;
+ for (i = 0; i < N_PQ; i++)
+ {
+ set_identifier (pq_strings[i], saved_not_pq[i]);
+ saved_not_pq[i] = NULL_TREE;
+ }
}
void
remember_protocol_qualifiers ()
{
- C_IS_RESERVED_WORD (ridpointers[(int) RID_IN]) = 1;
- C_IS_RESERVED_WORD (ridpointers[(int) RID_OUT]) = 1;
- C_IS_RESERVED_WORD (ridpointers[(int) RID_INOUT]) = 1;
- C_IS_RESERVED_WORD (ridpointers[(int) RID_BYCOPY]) = 1;
- C_IS_RESERVED_WORD (ridpointers[(int) RID_BYREF]) = 1;
- C_IS_RESERVED_WORD (ridpointers[(int) RID_ONEWAY]) = 1;
+ int i;
+ for (i = 0; i < N_PQ; i++)
+ saved_not_pq[i] = set_identifier (pq_strings[i], saved_pq[i]);
}
diff --git a/gcc/stringpool.c b/gcc/stringpool.c
index ceb454d..f5e8968 100644
--- a/gcc/stringpool.c
+++ b/gcc/stringpool.c
@@ -340,6 +340,25 @@ maybe_get_identifier (text)
return NULL_TREE;
}
+/* Look up an identifier with the name TEXT, replace its identifier
+ node with NODE, and return the old identifier node. This is used
+ by languages which need to enable and disable keywords based on
+ context; e.g. see remember_protocol_qualifiers in objc/objc-act.c. */
+tree
+set_identifier (text, node)
+ const char *text;
+ tree node;
+{
+ struct str_header *str;
+ tree old;
+ size_t length = strlen (text);
+
+ str = alloc_string (text, length, INSERT);
+ old = str->data; /* might be null */
+ str->data = node;
+ return old;
+}
+
/* Report some basic statistics about the string pool. */
void
diff --git a/gcc/tree.h b/gcc/tree.h
index 45252dd..cfcd7be 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -1922,6 +1922,13 @@ extern tree get_identifier PARAMS ((const char *));
extern tree maybe_get_identifier PARAMS ((const char *));
+/* Look up an identifier with the name TEXT, replace its identifier
+ node with NODE, and return the old identifier node. This is used
+ by languages which need to enable and disable keywords based on
+ context; e.g. see remember_protocol_qualifiers in objc/objc-act.c. */
+
+extern tree set_identifier PARAMS ((const char *, tree));
+
/* Construct various types of nodes. */
#define build_int_2(LO,HI) \