-static char Version[] = "ACK Modula-2 compiler Version 0.24";
+static char Version[] = "ACK Modula-2 compiler Version 0.25";
#define D_ERROR 0x4000 /* a compiler generated definition for an
undefined variable
*/
+#define D_INUSE 0x8000 /* identification in this scope (like D_IMPORT)
+ */
#define D_VALUE (D_PROCEDURE|D_VARIABLE|D_FIELD|D_ENUM|D_CONST|D_PROCHEAD)
#define D_ISTYPE (D_HIDDEN|D_TYPE|D_FTYPE)
-#define D_IMPORTED (D_IMPORT)
+#define D_IMPORTED (D_IMPORT|D_INUSE)
#define is_type(dfx) ((dfx)->df_kind & D_ISTYPE)
unsigned short df_flags;
#define D_NOREG 0x01 /* set if it may not reside in a register */
*/
register t_def *df;
- df = lookup(id, scope, 1, 0);
+ df = lookup(id, scope, 2, 0);
if ( /* Already in this scope */
df
|| /* A closed scope, and id defined in the pervasive scope */
(
scopeclosed(scope)
&&
- (df = lookup(id, PervasiveScope, 1, 0)))
+ (df = lookup(id, PervasiveScope, 2, 0)))
) {
switch(df->df_kind) {
+ case D_INUSE:
+ if (kind != D_INUSE) {
+ error("identifier \"%s\" already used; may not be redefined in this scope", df->df_idf->id_text);
+ }
+ return df;
+
case D_HIDDEN:
/* An opaque type. We may now have found the
definition of this type.
#include "type.h"
#include "misc.h"
+extern int pass_1;
+
t_def *
lookup(id, scope, import, flags)
register t_idf *id;
df->df_flags |= flags;
if (import) {
while (df->df_kind & D_IMPORTED) {
+ if (df->df_kind == D_INUSE && import != 1) break;
assert(df->imp_def != 0);
df = df->imp_def;
}
t_def *
lookfor(id, vis, message, flags)
register t_node *id;
- t_scopelist *vis;
+ register t_scopelist *vis;
{
/* Look for an identifier in the visibility range started by "vis".
If it is not defined create a dummy definition and,
if message is set, give an error message
*/
- register t_def *df;
register t_scopelist *sc = vis;
+ t_def *df;
while (sc) {
df = lookup(id->nd_IDF, sc->sc_scope, 1, flags);
- if (df) return df;
+ if (df) {
+ if (pass_1 &&
+ message &&
+ sc->sc_scope->sc_level < vis->sc_scope->sc_level &&
+ ! scopeclosed(vis->sc_scope)) {
+ define(id->nd_IDF, vis->sc_scope, D_INUSE)->
+ imp_def = df;
+ }
+ return df;
+ }
sc = nextvisible(sc);
}
if (message) id_not_declared(id);
- df = MkDef(id->nd_IDF, vis->sc_scope, D_ERROR);
- return df;
+ return MkDef(id->nd_IDF, vis->sc_scope, D_ERROR);
}
from this list.
*/
register t_def *df, *df1;
-#define INTERESTING D_MODULE|D_PROCEDURE|D_PROCHEAD|D_VARIABLE
+#define INTERESTING (D_MODULE|D_PROCEDURE|D_PROCHEAD|D_VARIABLE|D_IMPORTED)
df = 0;
df1 = *pdf;
register t_def *df1 = df->imp_def;
df1->df_flags |= df->df_flags & (D_USED|D_DEFINED);
- if (df->df_kind == D_IMPORT &&
- !(df->df_flags & D_IMP_BY_EXP)) {
+ if (df->df_kind == D_INUSE) return;
+ if ( !(df->df_flags & D_IMP_BY_EXP)) {
if (! (df->df_flags & (D_USED | D_DEFINED))) {
node_warning(
df->df_scope->sc_end,