bug in g++ in use of string literal with template

Dylan_S_Cuthbert@hq.scei.sony.co.jp Dylan_S_Cuthbert@hq.scei.sony.co.jp
Mon Jun 19 05:23:00 GMT 2000


This may be the cause of a problem I have been having using "asm" in templates.
It seems to output utter garbage into the asm file.  (however, my revision of
gcc is 2.9 from June 98 so it may be fixed)

In my current revision the keyword "volatile" is also unrecognised within a
template definition.

Regards

Dylan Cuthbert





f981500@FFZJ0LX0.bank.dresdner.net (James Kanze) 2000/06/19 09:15:41 PM

$B08@h(B: gcc-bugs@gcc.gnu.org
cc:    (bcc: Dylan S Cuthbert/SCEI)
$B7oL>(B: bug in g++ in use of string literal with template

The attached source doesn't work as expected, at least under Windows.
I would expect the runtime output to be 5; it is 0.  (In other
configurations, it can be some other arbitrary value.)  Having looked
at the source code, I suspect that somewhere, string literals are
being treated too much like other literals in the optimization, and
that in certain contexts, a copy of the string literal is used, rather
than the original.

Compiler outout:

------------------------------------------------------------------------------
g++ -v bug03.cc
Reading specs from
/Program/Cygnus/cygwin-b20/H-i586-cygwin32/bin/../lib/gcc-lib/i586-cygwin32/2.95/specs

gcc version 2.95 19990728 (release)

/Program/Cygnus/cygwin-b20/H-i586-cygwin32/bin/../lib/gcc-lib/i586-cygwin32/2.95/cpp.exe

-lang-c++ -v -iprefix
/Program/Cygnus/cygwin-b20/H-i586-cygwin32/bin/../lib/gcc-lib/i586-cygwin32/2.95/

-D__GNUC__=2 -D__GNUG__=2 -D__GNUC_MINOR__=95 -D__cplusplus -Di386 -D_WIN32
-DWINNT -D_X86_=1 -D__STDC__=1 -D__stdcall=__attribute__((__stdcall__))
-D__cdecl=__attribute__((__cdecl__)) -D__declspec(x)=__attribute__((x))
-D__i386__ -D_WIN32 -D__WINNT__ -D_X86_=1 -D__STDC__=1
-D__stdcall=__attribute__((__stdcall__)) -D__cdecl=__attribute__((__cdecl__))
-D__declspec(x)=__attribute__((x)) -D__i386 -D__WINNT -Asystem(winnt)
-Acpu(i386) -Amachine(i386) -D__EXCEPTIONS -remap -Acpu(i386) -Amachine(i386)
-Di386 -D__i386 -D__i386__ -Di586 -Dpentium -D__i586 -D__i586__ -D__pentium
-D__pentium__ -D__CYGWIN32__ -D__CYGWIN__ bug03.cc c:\tmp/ccwIaaaa.ii
GNU CPP version 2.95 19990728 (release) (80386, BSD syntax)
#include "..." search starts here:
#include <...> search starts here:

/Program/Cygnus/cygwin-b20/H-i586-cygwin32/bin/../lib/gcc-lib/i586-cygwin32/2.95/../../../../../include/g++-3


/Program/Cygnus/cygwin-b20/H-i586-cygwin32/bin/../lib/gcc-lib/i586-cygwin32/2.95/../../../../../include


/Program/Cygnus/cygwin-b20/H-i586-cygwin32/bin/../lib/gcc-lib/i586-cygwin32/2.95/../../../../i586-cygwin32/include


/Program/Cygnus/cygwin-b20/H-i586-cygwin32/bin/../lib/gcc-lib/i586-cygwin32/2.95/include

End of search list.
The following default directories have been omitted from the search path:
 /usr/include
End of omitted list.

/Program/Cygnus/cygwin-b20/H-i586-cygwin32/bin/../lib/gcc-lib/i586-cygwin32/2.95/cc1plus.exe

c:\tmp/ccwIaaaa.ii -quiet -dumpbase bug03.cc -version -o c:\tmp/ccSgbaaa.s
GNU C++ version 2.95 19990728 (release) (i586-cygwin32) compiled by GNU C
version 2.95 19990728 (release).

/Program/Cygnus/cygwin-b20/H-i586-cygwin32/bin/../lib/gcc-lib/i586-cygwin32/2.95/../../../../i586-cygwin32/bin/as.exe

-o c:\tmp/ccePbaaa.o c:\tmp/ccSgbaaa.s

/Program/Cygnus/cygwin-b20/H-i586-cygwin32/bin/../lib/gcc-lib/i586-cygwin32/2.95/collect2.exe

/Program/Cygnus/cygwin-b20/H-i586-cygwin32/bin/../lib/gcc-lib/i586-cygwin32/2.95/../../../../i586-cygwin32/lib/crt0.o

-L/Program/Cygnus/cygwin-b20/H-i586-cygwin32/bin/../lib/gcc-lib/i586-cygwin32/2.95

-L/Program/Cygnus/cygwin-b20/H-i586-cygwin32/bin/../lib/gcc-lib
-L/Program/Cygnus/cygwin-b20/H-i586-cygwin32/bin/../lib/gcc-lib/i586-cygwin32/2.95/../../../../i586-cygwin32/lib

-L/Program/Cygnus/cygwin-b20/H-i586-cygwin32/bin/../lib/gcc-lib/i586-cygwin32/2.95/../../..

c:\tmp/ccePbaaa.o -lstdc++ -lm -lgcc -lcygwin -luser32 -lkernel32 -ladvapi32
-lshell32 -lgcc
------------------------------------------------------------------------------

Source.  The error is NOT in the implementation of vector, since I
originally encountered the error in one of my own classes.  Replacing
the first parameter of the constructor of v with "text + 0" suppresses
the bug -- I think you'll agree that whatever my own misunderstandings
about C++ (I know I've pestered you unnecessarily in the past),
whether I use "text" or "text + 0", the results should be the same.

------------------------------------------------------------------------------

#include <iostream.h>
#include <vector>

int
main()
{
    static char const   text[] = "test" ;
    vector< char >      v( text , text + sizeof( text ) ) ;
    cout << v.size() << '\n' ;
    return 0 ;
}

------------------------------------------------------------------------------

--
James Kanze                               mailto:kanze@gabi-soft.de
Conseils en informatique oriente objet/
                   Beratung in objektorientierter Datenverarbeitung
Ziegelhttenweg 17a, 60598 Frankfurt, Germany Tel. +49(069)63198627




More information about the Gcc-bugs mailing list