diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7d618c39a5f..015b2406aaf 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2002-08-15 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-08-15 Douglas B Rupp * dbxout.c (dbx_debug_hooks): Update end_prologue, end_epilogue. diff --git a/gcc/c-common.h b/gcc/c-common.h index 038b23982e3..6968d70dac9 100644 --- a/gcc/c-common.h +++ b/gcc/c-common.h @@ -790,6 +790,11 @@ extern int warn_deprecated; extern int max_tinst_depth; +/* 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 11e0e442cc2..eab176a62f7 100644 --- a/gcc/c-parse.in +++ b/gcc/c-parse.in @@ -562,6 +562,10 @@ alignof: ALIGNOF { skip_evaluation++; } ; +typeof: + TYPEOF { skip_evaluation++; } + ; + cast_expr: unary_expr | '(' typename ')' cast_expr %prec UNARY @@ -1394,10 +1398,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 c92f1f13565..0d6829fc6e9 100644 --- a/gcc/c-tree.h +++ b/gcc/c-tree.h @@ -311,11 +311,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 we are reading code that came from a system header file. */ extern int system_header_p; diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index dedb72f59ff..bfc44848ad7 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -1441,7 +1441,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)