diff options
author | Teddy <[email protected]> | 2014-04-10 18:27:48 +0800 |
---|---|---|
committer | Teddy <[email protected]> | 2014-04-10 18:27:48 +0800 |
commit | f314c03bdf62b83fe4d2b8d600d15d839a0c32b9 (patch) | |
tree | 6543410a26ff84ff78196f1a2bb569a0fb3f223b | |
parent | fe75fc6d0569f6df7ff33c96566873eb3ff10dc2 (diff) |
...
-rw-r--r-- | TODO.rst | 2 | ||||
-rw-r--r-- | const.h | 2 | ||||
-rw-r--r-- | semantics.c | 18 | ||||
-rw-r--r-- | testcases/pass.c | 2 |
4 files changed, 15 insertions, 9 deletions
@@ -9,7 +9,7 @@ TODO - Fix: - check global definition (if type is complete) when semantic analysis finishes - - local function declaration is not in a local scope (external linkage issue) + - local function declaration is not in a local scope (external linkage issue) (will not be fixed) - incomplete type issues - function **definition** requires complete return type (function declaration does not) (done) - array requires **complete** elem type (done) @@ -24,3 +24,5 @@ #define MAX_ERROR_BUFF 1024 #define INT_SIZE 4 #define CHAR_SIZE 1 +#define EXT_LINKAGE 1 +#define NO_LINKAGE 0 diff --git a/semantics.c b/semantics.c index 4c87ebb..6e2075c 100644 --- a/semantics.c +++ b/semantics.c @@ -457,11 +457,6 @@ CVar_t semantics_p_decl(CNode *p, CScope_t scope) { CVar_t var = semantics_declr(p->chd->next, semantics_type_spec(p->chd, scope), scope, 0); - if (!type_is_complete(var->type)) - { - sprintf(err_buff, "parameter '%s' has incomplete type", var->name); - ERROR(var->ast); - } return var; } @@ -1377,7 +1372,7 @@ CVar_t semantics_func(CNode *p, CScope_t scope) { the global scope, while all the types specified in parameters retain in local scope. The key point is to make sure semantics_params does not push any var */ CSNode *ntop = scope->top; - CVar_t p; + CVar_t var; scope->top = ntop->next; scope->lvl--; if (cscope_push_var(scope, res)) @@ -1385,8 +1380,15 @@ CVar_t semantics_func(CNode *p, CScope_t scope) { scope->top = ntop; scope->lvl++; - for (p = func->rec.func.params; p; p = p->next) - cscope_push_var(scope, p); + for (var = func->rec.func.params; var; var = var->next) + { + cscope_push_var(scope, var); + if (!type_is_complete(var->type)) + { + sprintf(err_buff, "parameter '%s' has incomplete type", var->name); + ERROR(var->ast); + } + } } func->rec.func.local = semantics_comp(p->chd->next->next, scope); /* check comp */ func->rec.func.body = p->chd->next->next; diff --git a/testcases/pass.c b/testcases/pass.c index 4d9041e..4b4dfed 100644 --- a/testcases/pass.c +++ b/testcases/pass.c @@ -86,6 +86,8 @@ int f(int f()) { f(complex_pointer); } +int incomp(struct I a); + struct Node n; struct Node {int x, y;} n; /* global forward declaration is ok */ |