From 42be70e717d5902df50ace07181cb62fe2ed035e Mon Sep 17 00:00:00 2001 From: Alexandre Oliva Date: Sun, 1 Sep 2002 20:11:07 +0000 Subject: [PATCH] c-tree.h (skip_evaluation): Move declaration... * c-tree.h (skip_evaluation): Move declaration... * c-common.h: ... here. * c-typeck.c (build_external_ref): Don't assemble_external nor mark a tree as used if skip_evaluation is set. * c-parse.in (typeof): New non-terminal to set skip_evaluation around TYPEOF. (typespec_nonreserved_nonattr): Use it. From-SVN: r56727 --- gcc/ChangeLog | 10 ++++++++++ gcc/c-common.h | 5 +++++ gcc/c-parse.in | 12 ++++++++---- gcc/c-tree.h | 5 ----- gcc/c-typeck.c | 3 ++- 5 files changed, 25 insertions(+), 10 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 430f1c2d28a6..45978d6f7adb 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2002-09-01 Alexandre Oliva + + * c-tree.h (skip_evaluation): Move declaration... + * c-common.h: ... here. + * c-typeck.c (build_external_ref): Don't assemble_external nor + mark a tree as used if skip_evaluation is set. + * c-parse.in (typeof): New non-terminal to set skip_evaluation + around TYPEOF. + (typespec_nonreserved_nonattr): Use it. + 2002-09-01 Marek Michalkiewicz 2002-08-13 Denis Chertykov diff --git a/gcc/c-common.h b/gcc/c-common.h index df74f2e43026..61a7f107f324 100644 --- a/gcc/c-common.h +++ b/gcc/c-common.h @@ -464,6 +464,11 @@ extern int warn_conversion; extern int warn_long_long; +/* Nonzero means the expression being parsed will never be evaluated. + This is a count, since unevaluated expressions can nest. */ + +extern int skip_evaluation; + /* C types are partitioned into three subsets: object, function, and incomplete types. */ #define C_TYPE_OBJECT_P(type) \ diff --git a/gcc/c-parse.in b/gcc/c-parse.in index 9740aa376669..c7cbb16d38ec 100644 --- a/gcc/c-parse.in +++ b/gcc/c-parse.in @@ -534,6 +534,10 @@ alignof: ALIGNOF { skip_evaluation++; } ; +typeof: + TYPEOF { skip_evaluation++; } + ; + cast_expr: unary_expr | '(' typename ')' cast_expr %prec UNARY @@ -1376,10 +1380,10 @@ ifobjc | non_empty_protocolrefs { $$ = get_object_reference ($1); } end ifobjc - | TYPEOF '(' expr ')' - { $$ = TREE_TYPE ($3); } - | TYPEOF '(' typename ')' - { $$ = groktypename ($3); } + | typeof '(' expr ')' + { skip_evaluation--; $$ = TREE_TYPE ($3); } + | typeof '(' typename ')' + { skip_evaluation--; $$ = groktypename ($3); } ; /* typespec_nonreserved_attr does not exist. */ diff --git a/gcc/c-tree.h b/gcc/c-tree.h index 999bc2f0af0e..54208db58c0a 100644 --- a/gcc/c-tree.h +++ b/gcc/c-tree.h @@ -287,11 +287,6 @@ extern int current_function_returns_null; extern int current_function_returns_abnormally; -/* Nonzero means the expression being parsed will never be evaluated. - This is a count, since unevaluated expressions can nest. */ - -extern int skip_evaluation; - /* Nonzero means `$' can be in an identifier. */ extern int dollars_in_ident; diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index b21cac0bfb0b..d400f3969b68 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -1493,7 +1493,8 @@ build_external_ref (id, fun) if (TREE_TYPE (ref) == error_mark_node) return error_mark_node; - assemble_external (ref); + if (!skip_evaluation) + assemble_external (ref); TREE_USED (ref) = 1; if (TREE_CODE (ref) == CONST_DECL) -- 2.47.2