
[Release b]
<t4m_bug_foo_bar>
(Not fixed)
Sat May 8 10:17:23 WEST 2004
In the current release of tendra4minix (a) (and also in the original 4.1.2
version), the compilation of the program foo_bar.C produces the following error
Internal error: 'tag 1' used but not defined.
It is bug3 of http://www.ten15.org. The problem arises in the function
add_compound_stmt [statement.c], and I think that it is very difficult to
solve.
To understand it, here is a trace of the calls to the function
add_compound_stmt for the program
void hola(void) {
int uno;
double dos;
long double tres;
}
add_compound_stmt, ns = hola, nspace_last = uno, nspace_prev = <param1>
add_compound_stmt, ns = hola, nspace_last = dos, nspace_prev = uno
add_compound_stmt, ns = hola, nspace_last = tres, nspace_prev = dos
add_compound_stmt, ns = hola, nspace_last = tres, nspace_prev = tres
add_compound_stmt, ns = hola, nspace_last = tres, nspace_prev = tres
An invocation of add_compound_stmt with EQ_member(p, q), where
MEMBER p = DEREF_member ( nspace_last ( ns ) ) ;
MEMBER q = DEREF_member ( nspace_prev ( ns ) ) ;
makes the compiler skip a call to the function make_decl_stmt [statement.c],
and this is happening spuriously in foo_bar.C,
void bla(void) {
struct foo { int bar; };
static struct foo foo;
struct foo bar = foo;
}
add_compound_stmt, ns = bla, nspace_last = , nspace_prev = <param1>
add_compound_stmt, ns = bla, nspace_last = foo, nspace_prev = foo
add_compound_stmt, ns = bla, nspace_last = bar, nspace_prev = foo
add_compound_stmt, ns = bla, nspace_last = bar, nspace_prev = bar
add_compound_stmt, ns = bla, nspace_last = bar, nspace_prev = bar
The second line of this trace is wrong: nspace_prev should be NULL; this is
what happens in foo_bar_e.C, where we have changed the name of the variable
from 'foo' to 'fo',
void bla(void) {
struct foo { int bar; };
static struct foo fo;
struct foo bar = fo;
}
add_compound_stmt, ns = bla, nspace_last = , nspace_prev = <param1>
add_compound_stmt, ns = bla, nspace_last = fo, nspace_prev =
add_compound_stmt, ns = bla, nspace_last = bar, nspace_prev = fo
add_compound_stmt, ns = bla, nspace_last = bar, nspace_prev = bar
add_compound_stmt, ns = bla, nspace_last = bar, nspace_prev = bar
The wrong call (where nspace_last is equal to nspace_prev) is made from the
parser, more specifically, from line 1132 of the file
src/producers/c/syntax/syntax3.c,
(ZI448) = add_compound_stmt ( (ZI467), (ZI416) ) ;
but this is a sid-generated file, and I do not have time to mess with neither
sid nor the infamous C++ syntax. Besides, this bug is not important since the
program is pathological.