The following GNU C testcase ICEs with every compiler version tested from 2.6.3 to recent mainline. With mainline 3.5.0 20040710 on i686-pc-linux-gnu, the error is: t.c: In function `nested': t.c:12: internal compiler error: in make_decl_rtl, at varasm.c:758 Please submit a full bug report, with preprocessed source if appropriate. See <URL:http://gcc.gnu.org/bugs.html> for instructions. With 3.4.1, the error is: t.c: In function `nested': t.c:12: internal compiler error: in expand_expr_real, at expr.c:6638 Please submit a full bug report, with preprocessed source if appropriate. See <URL:http://gcc.gnu.org/bugs.html> for instructions. The proper fix may well involve getting rid of variable-sized structures in GNU C, but I don't know whether the problem can be triggered with equivalent testcases in other languages (all ICEs are in various middle-end files). #include <stddef.h> extern int printf (const char *, ...); extern void *memset (void *, int, size_t); int bar (int (*)(), int, void *); int main(int argc, char **argv) { struct s { int a; char b[argc]; }; int nested (struct s x) { return x.a + sizeof(x); } struct s t; memset (&t, 0, sizeof(t)); t.a = 123; printf("%d\n", bar (nested, argc, &t)); return 0; }
Confirmed indeed. I guess we should say "don't do evil things!" :-)
BTW, the code is definitely invalid (even leaving aside the matter of variable-sized structures). You declare int bar (int (*)(), int, void *); and call it with int nested (struct s x) { return x.a + sizeof(x); } bar (nested, argc, &t); Note that &nested does not satisfy the signature that bar() expects as first argument. It seems, however, as if we never even get to the point where gcc would like to check for this, it ICEs before that. Here's something that should be closer to validity: --------------- void bar (void *); int main(int argc, char **argv) { struct s { char b[argc]; }; int nested (struct s x) { return 0; } struct s t; bar ((void*)&nested); return 0; } ---------------- g/x> /home/bangerth/bin/gcc-3.5*/bin/gcc -c x.c x.c: In function `nested': x.c:5: internal compiler error: in make_decl_rtl, at varasm.c:758 Please submit a full bug report, with preprocessed source if appropriate. See <URL:http://gcc.gnu.org/bugs.html> for instructions. g/x> /home/bangerth/bin/gcc-2.95.3/bin/gcc -c x.c x.c: In function `nested': x.c:5: Internal compiler error in `fix_lexical_addr', at function.c:5622 Please submit a full bug report. See <URL:http://www.gnu.org/software/gcc/bugs.html> for instructions. W.
Subject: Re: Nested function and variable-sized structure ICE On Thu, 15 Jul 2004, bangerth at dealii dot org wrote: > BTW, the code is definitely invalid (even leaving aside the matter of > variable-sized structures). You declare > int bar (int (*)(), int, void *); > and call it with > int nested (struct s x) { return x.a + sizeof(x); } > bar (nested, argc, &t); > Note that &nested does not satisfy the signature that bar() expects > as first argument. It seems, however, as if we never even get to > the point where gcc would like to check for this, it ICEs before that. I deliberately declare bar's first argument with an old-style non-prototype declaration precisely because a matching prototype can't be written at that point - but &nested can match a simple "pointer to function returning int"! (The original two-file testcase <http://gcc.gnu.org/ml/gcc/2004-07/msg00776.html> was intended to be a valid illustration of how variable-sized arguments are part of the C ABI, which had the unintended effect of showing the ABI to be completely irrelevant for this code because all versions of GCC ICE on it.)
This now works on the mainline. If I get time I will apply the testcase (otherwise someone else can do that plus close the bug).
Fixed: Search converges between 2004-07-16-trunk (#487) and 2004-07-17-trunk (#488). Committed the testcase so closing.
Subject: Bug 16567 CVSROOT: /cvs/gcc Module name: gcc Changes by: pinskia@gcc.gnu.org 2004-10-15 13:49:21 Modified files: gcc/testsuite : ChangeLog Added files: gcc/testsuite/gcc.c-torture/compile: nested-1.c Log message: 2004-10-14 Andrew Pinski <pinskia@physics.uc.edu> PR middle-end/16567 * gcc.c-torture/compile/nested-1.c: New test. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gcc.c-torture/compile/nested-1.c.diff?cvsroot=gcc&r1=NONE&r2=1.1 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/ChangeLog.diff?cvsroot=gcc&r1=1.4454&r2=1.4455