Package: g++ Version: 3:3.3-2 Severity: normal
-- System Information Debian Release: 3.0 Architecture: i386 Kernel: Linux suffix 2.4.21 #1 Fri Aug 1 13:53:33 CEST 2003 i686 Locale: LANG=C, LC_CTYPE=C Versions of packages g++ depends on: ii cpp 3:3.3-2 The GNU C preprocessor. ii g++-3.3 1:3.3.1-1 The GNU C++ compiler ii gcc-3.3 1:3.3.1-1 The GNU C compiler Hi, The following little program produces unexpected output. As an alternate compiler (as a check I used the Intel C++ compiler version 7.0) did not produce the problem, I assume I ran into a little bug; hence the bugreport. The problem is described in some detail beyond the program's source: ===================================================================== #include <iostream> #include <cstdarg> using namespace std; class Foo { va_list list; public: Foo(int n, ...) { va_start(list, n); } void bar() const { va_list l(list); cout << "Saw " << va_arg(l, int) << endl; } }; void two(int start, Foo foo) { for (int idx = 0; idx < 2; idx++) foo.bar(); } void three(int start, int end, Foo foo) { for (int idx = 0; idx < 2; idx++) foo.bar(); } int main(int argc, char **argv) { Foo foo(3, 15); two(2, foo); three(2, 2, foo); // unexpected output from here. two(2, foo); return 0; } ================================================================== Problem description: The clas `Foo' has a constructor accepting variable numbers of arguments. It initializes a `va_list' data member which is used to initialize a local `va_list' variable inside its `bar()' function. The `bar()' function then prints the first of the variable arguments, which is, in this program, always an `int' value. The function `two()' receives two value-type arguments: an `int' and a `Foo' object: the `Foo' object is therefore copied internally to initialize the parameter `foo'. The `int' argument is not used, and `foo.bar()' is called twice. The function `three()' receives three value-type arguments, two `int's and a `Foo' object. Both `int' arguments are not used, and `foo.bar()' is called twice, like in the function `two()'. In `main()' a `Foo' object is constructed, receiving 2 arguments. The second value, 15, is the `int' to be accessed by `Foo::bar()'. At the first call of `two()', 15 is displayed, as expected. Then, unexpected values are displayed by the call of `three()'. Therafter, the problem persists: calling `two()' for the second time now also produces unexpected values. On my computer I get the following output: Saw 15 Saw 15 Saw -1073743160 Saw -1073743160 Saw -1073743160 Saw -1073743160 As mentioned, when the program is compiled by, e.g., the Intel V 7.0 compiler the problem does not appear. In that case, all displayed values are 15, as expected. Hopefully the problem can be solved. If I can assist, please let me know. Kind regards, Frank B. Brokken.