ref: e1715607a4c65b30729c43c736eb67b957f35073
parent: a30b9999606a95dfdc73c4ae0264c2fecdb992c0
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Sat Jul 1 14:27:31 EDT 2017
[cc1] Move defined() logic to a function The code of defined was a bit confusing while it was in unary(), but this new separation helps to have better separation of responsabilities.
--- a/cc1/expr.c
+++ b/cc1/expr.c
@@ -827,6 +827,28 @@
}
}
+static Node *
+defined(void)
+{
+ Symbol *sym;
+ int paren;
+
+ disexpand = 1;
+ next();
+ paren = accept('(');
+ if (yytoken != IDEN && yytoken != TYPEIDEN)
+ cpperror("operator 'defined' requires an identifier");
+ if (yytoken == TYPEIDEN || !(yylval.sym->flags & SDECLARED))
+ sym = zero;
+ else
+ sym = one;
+ disexpand = 0;
+ next();
+ if (paren)
+ expect(')');
+ return constnode(sym);
+}
+
static Node *cast(int);
static Node *
@@ -833,10 +855,8 @@
unary(int needdecay)
{
Node *(*fun)(int, Node *), *np;
- Symbol *sym;
int op;
Type *tp;
- int paren;
switch (yytoken) {
case '!': op = 0; fun = negation; break;
@@ -859,24 +879,9 @@
goto chk_decay;
case IDEN:
case TYPEIDEN:
- if (lexmode != CPPMODE || strcmp(yylval.sym->name, "defined"))
- goto call_postfix;
- disexpand = 1;
- next();
- paren = accept('(');
- if (yytoken != IDEN && yytoken != TYPEIDEN)
- cpperror("operator 'defined' requires an identifier");
- if (yytoken == TYPEIDEN || !(yylval.sym->flags & SDECLARED))
- sym = zero;
- else
- sym = one;
- disexpand = 0;
- next();
- if (paren)
- expect(')');
- return constnode(sym);
+ if (lexmode == CPPMODE && !strcmp(yylval.sym->name, "defined"))
+ return defined();
default:
- call_postfix:
np = postfix(primary());
goto chk_decay;
}