[hackers] [scc] Add support for define() in #if || Roberto E. Vargas Caballero
commit 18bc293eda5e66a9cd3f86d9dcb1c987de599779
Author: Roberto E. Vargas Caballero <k0ga_AT_shike2.com>
AuthorDate: Mon Oct 5 15:39:32 2015 +0200
Commit: Roberto E. Vargas Caballero <k0ga_AT_shike2.com>
CommitDate: Mon Oct 5 15:39:32 2015 +0200
Add support for define() in #if
This is really stupidity of ansi c comitee, but ok, we need it.
diff --git a/cc1/cpp.c b/cc1/cpp.c
index a5ad74a..4ed4ffb 100644
--- a/cc1/cpp.c
+++ b/cc1/cpp.c
_AT_@ -228,7 +228,9 @@ expand(char *begin, Symbol *sym)
char *arglist[NR_MACROARG], arguments[INPUTSIZ], buffer[BUFSIZE];
macroname = sym->name;
- if (!(sym->flags & ISDECLARED)) {
+ if ((sym->flags & ISDECLARED) == 0) {
+ if (namespace == NS_CPP && !strcmp(sym->name, "defined"))
+ return 0; /* we found a 'defined in an #if */
/*
* This case happens in #if were macro not defined must
* be expanded to 0
diff --git a/cc1/expr.c b/cc1/expr.c
index bc555e4..6ec964b 100644
--- a/cc1/expr.c
+++ b/cc1/expr.c
_AT_@ -496,6 +496,32 @@ negation(char op, Node *np)
}
}
+static Symbol *
+notdefined(Symbol *sym)
+{
+ int isdef;
+
+ if (namespace == NS_CPP && !strcmp(sym->name, "defined")) {
+ disexpand = 1;
+ next();
+ expect('(');
+ sym = yylval.sym;
+ expect(IDEN);
+ expect(')');
+
+ isdef = (sym->flags & ISDEFINED) != 0;
+ sym = newsym(NS_IDEN);
+ sym->type = inttype;
+ sym->flags |= ISCONSTANT;
+ sym->u.i = isdef;
+ disexpand = 0;
+ return sym;
+ }
+ errorp("'%s' undeclared", yytext);
+ sym->type = inttype;
+ return install(sym->ns, yylval.sym);
+}
+
/*************************************************************
* grammar functions *
*************************************************************/
_AT_@ -505,18 +531,18 @@ primary(void)
Node *np;
Symbol *sym;
+ sym = yylval.sym;
switch (yytoken) {
case CONSTANT:
- np = constnode(yylval.sym);
+ constant:
+ np = constnode(sym);
next();
break;
case IDEN:
- sym = yylval.sym;
- if ((sym->flags & ISDECLARED) == 0) {
- errorp("'%s' undeclared", yytext);
- sym->type = inttype;
- install(sym->ns, yylval.sym);
- }
+ if ((sym->flags & ISDECLARED) == 0)
+ sym = notdefined(sym);
+ if (sym->flags & ISCONSTANT)
+ goto constant;
sym->flags |= ISUSED;
np = varnode(sym);
next();
Received on Mon Oct 05 2015 - 15:40:14 CEST
This archive was generated by hypermail 2.3.0
: Mon Oct 05 2015 - 15:48:11 CEST