This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
c++/868: Macro && template class && member argument == ICE
- To: gcc-gnats at gcc dot gnu dot org
- Subject: c++/868: Macro && template class && member argument == ICE
- From: sadowski at lucent dot com
- Date: 22 Nov 2000 16:30:39 -0000
- Reply-To: sadowski at lucent dot com
>Number: 868
>Category: c++
>Synopsis: Macro && template class && member argument == ICE
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: unassigned
>State: open
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Wed Nov 22 08:36:00 PST 2000
>Closed-Date:
>Last-Modified:
>Originator: Gilles Sadowski
>Release: gcc version 2.95.1 19990816 (release)
>Organization:
>Environment:
Reading specs from /opt/exp/gnu/lib/gcc-lib/sparc-sun-solaris2.4/2.95.1/specs
gcc version 2.95.1 19990816 (release)
SunOS 5.6 Generic_105181-14 sun4u sparc SUNW,Ultra-5_10
>Description:
Using a macro whose argument is a class member in the
definition of a method of a template class provokes
an internal compiler error.
Compiler output:
b.cc: In method `void Test<T>::make_test(T)':
b.cc:94: Internal compiler error.
b.cc:94: Please submit a full bug report.
b.cc:94: See <URL:http://www.gnu.org/software/gcc/faq.html#bugreport> for instructions.
In the code below, when BUG is defined, the compilation
generates ICE (1) at the line where the 'SAVE' macro is
used. Nevertheless, similar code when used in a non
template class (3) or whenever the macro argument is not
a class member (2) compiles OK.
See attached file 'b.cc' for the macro definition.
///// A template class /////
template<typename T>
class Test
{
public:
Test( T t ) : _t( t ) {}
void make_test( T a ) {
cerr << "Template:" << endl ;
cerr << "_t=" << _t << endl ;
if (1) {
#ifdef BUG
SAVE( _t ) // ICE here (1)
_t = a ;
#endif
cerr << "_t=" << _t << endl ;
}
cerr << "_t=" << _t << endl ;
return ;
}
void make_test_temp( T a ) {
cerr << "Template (temporary):" << endl ;
T b = _t ;
cerr << "b=" << b << endl ;
if (1) {
SAVE( b ) // But NOT here (2)
b = a ;
cerr << "b=" << b << endl ;
}
cerr << "b=" << b << endl ;
return ;
}
private:
T _t ;
} ;
///// NOT a template class /////
class Test_2
{
public:
Test_2( string t ) : _t( t ) {}
void make_test( string a ) {
cerr << "No template:" << endl ;
cerr << "_t=" << _t << endl ;
if (1) {
SAVE( _t ) // And also NOT here (3)
_t = a ;
cerr << "_t=" << _t << endl ;
}
cerr << "_t=" << _t << endl ;
return ;
}
private:
string _t ;
} ;
int main()
{
Test<string> t( "Hi" ) ;
Test_2 t_2( "Hi_2" ) ;
t.make_test( "Hello" ) ;
t.make_test_temp( "Hello_temp" ) ;
t_2.make_test( "Hello_2" ) ;
return 0 ;
}
>How-To-Repeat:
This succeeds:
g++ --save-temps -o b b.cc
And the output of program 'b' should be:
Template:
_t=Hi
_t=Hi
_t=Hi
Template (temporary):
b=Hi
b=Hello_temp
b=Hi
No template:
_t=Hi_2
_t=Hello_2
_t=Hi_2
But this fails:
g++ --save-temps -o b -DBUG b.cc
>Fix:
>Release-Note:
>Audit-Trail:
>Unformatted:
----gnatsweb-attachment----
Content-Type: application/octet-stream; name="b.cc"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="b.cc"
IyBpbmNsdWRlIDxpb3N0cmVhbT4KIyBpbmNsdWRlIDxzdHJpbmc+CgovLyBDb2RlIHVzZWQgaGVy
ZSBoaXMgdGFrZW4gZnJvbSBhbiBhcnRpY2xlIGJ5IFJhZG9zbGF2IEdldG92IAovLyAoIk5vdC1T
by1PYnZpb3VzIFV0aWxpdHkgTWFjcm9zIikgcHVibGlzaGVkIGluIHRoZSBNYXJjaCAyMDAwCi8v
IGlzc3VlIG9mIEMvQysrIFVzZXJzIEpvdXJuYWwKCiMgaW5jbHVkZSA8bmV3PgoKLy8gTWFjcm8g
VU5JUVVFX05BTUUgcHJvZHVjZXMgYW4gaWRlbnRpZmllciB1bmlxdWUgZm9yIGVhY2ggbGluZS4K
I2RlZmluZSBVTklRVUVfTkFNRV8xKCBwcmVmaXgsIHggKSBwcmVmaXgjI3gKI2RlZmluZSBVTklR
VUVfTkFNRV8yKCBwcmVmaXgsIHggKSBVTklRVUVfTkFNRV8xKCBwcmVmaXgsIHggKQojZGVmaW5l
IFVOSVFVRV9OQU1FX1dQKCBwcmVmaXggKSAgIFVOSVFVRV9OQU1FXzIoIHByZWZpeCwgX19MSU5F
X18gKQojZGVmaW5lIFVOSVFVRV9OQU1FICAgICAgICAgICAgICAgIFVOSVFVRV9OQU1FX1dQKCBH
aWxsZXNfU2Fkb3dza2lfT05fTElORV8gKQoKbmFtZXNwYWNlIFV0aWxpdHlNYWNyb3MKewoKdGVt
cGxhdGU8dHlwZW5hbWUgQiwgdW5zaWduZWQgaW50IHNpemU+CmNsYXNzIFVuaXZlcnNhbFN0b3Jh
Z2UKewogcHVibGljOgogIHRlbXBsYXRlPHR5cGVuYW1lIEY+CiAgICBVbml2ZXJzYWxTdG9yYWdl
KCBGIGNvbnN0ICYgZnJvbSApCiAgICB7CiAgICAgIHR5cGVkZWYgY2hhciBhc3NlcnRTaXplWyBz
aXplb2YoZnJvbSkgPT0gc2l6ZSBdIDsKICAgICAgaWYgKCBCIGNvbnN0ICogY29uc3QgYXNzZXJ0
SW5oZXJpdGFuY2UgPSAmZnJvbSApIDsKCiAgICAgIG5ldyAoc3RvcmFnZSkgRiggZnJvbSApIDsK
ICAgIH0KCiAgflVuaXZlcnNhbFN0b3JhZ2UoKSB7ICgoQiopIHN0b3JhZ2UpLT5+QigpIDsgfQoK
IHByaXZhdGU6CiAgY2hhciBzdG9yYWdlW3NpemVdIDsKfSA7CgpjbGFzcyBEZWxheWVkQXNzaWdu
ZXJfQmFzZQp7CiBwdWJsaWM6CiAgdmlydHVhbCB+RGVsYXllZEFzc2lnbmVyX0Jhc2UoKSB7fQp9
IDsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CmNsYXNzIERlbGF5ZWRBc3NpZ25lciA6IHB1YmxpYyBE
ZWxheWVkQXNzaWduZXJfQmFzZQp7CiBwdWJsaWM6CiAgRGVsYXllZEFzc2lnbmVyKCBUICYgdiAp
IDogX3JlZmVyZW5jZSggdiApLCBfdmFsdWUoIHYgKSB7fQogIERlbGF5ZWRBc3NpZ25lciggVCAm
IHYsIFQgY29uc3QgJiB3ICkgOiBfcmVmZXJlbmNlKCB2ICksIF92YWx1ZSggdyApIHt9CgogIH5E
ZWxheWVkQXNzaWduZXIoKSB7IF9yZWZlcmVuY2UgPSBfdmFsdWUgOyB9CgogcHJpdmF0ZToKICBU
ICYgX3JlZmVyZW5jZSA7CiAgVCBfdmFsdWUgOwp9IDsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+Cmlu
bGluZSBEZWxheWVkQXNzaWduZXI8VD4gbWFrZURlbGF5ZWRBc3NpZ25lciggVCAmIHYgKQp7CiAg
cmV0dXJuIERlbGF5ZWRBc3NpZ25lcjxUPiggdiApIDsKfQoKdGVtcGxhdGU8dHlwZW5hbWUgVD4K
aW5saW5lIERlbGF5ZWRBc3NpZ25lcjxUPiBtYWtlRGVsYXllZEFzc2lnbmVyKCBUICYgdiwgVCBj
b25zdCAmIHcgKQp7CiAgcmV0dXJuIERlbGF5ZWRBc3NpZ25lcjxUPiggdiwgdyApIDsKfQoKfSAv
LyBuYW1lc3BhY2UgVXRpbGl0eU1hY3JvCgojZGVmaW5lIFNBVkUoIHggKSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKVXRp
bGl0eU1hY3Jvczo6VW5pdmVyc2FsU3RvcmFnZTxVdGlsaXR5TWFjcm9zOjpEZWxheWVkQXNzaWdu
ZXJfQmFzZSwgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
c2l6ZW9mKCBVdGlsaXR5TWFjcm9zOjptYWtlRGVsYXllZEFzc2lnbmVyKCB4ICkgKT4gXAogIFVO
SVFVRV9OQU1FKCBVdGlsaXR5TWFjcm9zOjptYWtlRGVsYXllZEFzc2lnbmVyKCB4ICkgKSA7CgoK
dXNpbmcgbmFtZXNwYWNlIHN0ZCA7CgovLy8vLyBBIHRlbXBsYXRlIGNsYXNzIC8vLy8vCnRlbXBs
YXRlPHR5cGVuYW1lIFQ+CmNsYXNzIFRlc3QKewpwdWJsaWM6CiAgVGVzdCggVCB0ICkgOiBfdCgg
dCApIHt9CgogIHZvaWQgbWFrZV90ZXN0KCBUIGEgKSB7CiAgICBjZXJyIDw8ICJUZW1wbGF0ZToi
IDw8IGVuZGwgOwogICAgY2VyciA8PCAiX3Q9IiA8PCBfdCA8PCBlbmRsIDsKCiAgICBpZiAoMSkg
ewoKI2lmZGVmIEJVRwogICAgICBTQVZFKCBfdCApCS8vIElDRSBoZXJlICgxKQogICAgICBfdCA9
IGEgOwojZW5kaWYKICAgICAgY2VyciA8PCAiX3Q9IiA8PCBfdCA8PCBlbmRsIDsKICAgIH0KCiAg
ICBjZXJyIDw8ICJfdD0iIDw8IF90IDw8IGVuZGwgOwogICAgcmV0dXJuIDsKICB9CgogIHZvaWQg
bWFrZV90ZXN0X3RlbXAoIFQgYSApIHsKICAgIGNlcnIgPDwgIlRlbXBsYXRlICh0ZW1wb3Jhcnkp
OiIgPDwgZW5kbCA7CiAgICBUIGIgPSBfdCA7CiAgICBjZXJyIDw8ICJiPSIgPDwgYiA8PCBlbmRs
IDsKCiAgICBpZiAoMSkgewoKICAgICAgU0FWRSggYiApCQkvLyBCdXQgTk9UIGhlcmUgKDIpCiAg
ICAgIGIgPSBhIDsKICAgICAgY2VyciA8PCAiYj0iIDw8IGIgPDwgZW5kbCA7CiAgICB9CgogICAg
Y2VyciA8PCAiYj0iIDw8IGIgPDwgZW5kbCA7CiAgICByZXR1cm4gOwogIH0KCnByaXZhdGU6CiAg
VCBfdCA7Cn0gOwoKLy8vLy8gTk9UIGEgdGVtcGxhdGUgY2xhc3MgLy8vLy8KY2xhc3MgVGVzdF8y
CnsKcHVibGljOgogIFRlc3RfMiggc3RyaW5nIHQgKSA6IF90KCB0ICkge30KCiAgdm9pZCBtYWtl
X3Rlc3QoIHN0cmluZyBhICkgewogICAgY2VyciA8PCAiTm8gdGVtcGxhdGU6IiA8PCBlbmRsIDsK
ICAgIGNlcnIgPDwgIl90PSIgPDwgX3QgPDwgZW5kbCA7CgogICAgaWYgKDEpIHsKCiAgICAgIFNB
VkUoIF90ICkJLy8gQW5kIGFsc28gTk9UIGhlcmUgKDMpCiAgICAgIF90ID0gYSA7CiAgICAgIGNl
cnIgPDwgIl90PSIgPDwgX3QgPDwgZW5kbCA7CiAgICB9CgogICAgY2VyciA8PCAiX3Q9IiA8PCBf
dCA8PCBlbmRsIDsKICAgIHJldHVybiA7CiAgfQoKcHJpdmF0ZToKICBzdHJpbmcgX3QgOwp9IDsK
CgppbnQgbWFpbigpCnsKICBUZXN0PHN0cmluZz4gdCggIkhpIiApIDsKICBUZXN0XzIgdF8yKCAi
SGlfMiIgKSA7CgogIHQubWFrZV90ZXN0KCAiSGVsbG8iICkgOwogIHQubWFrZV90ZXN0X3RlbXAo
ICJIZWxsb190ZW1wIiApIDsKCiAgdF8yLm1ha2VfdGVzdCggIkhlbGxvXzIiICkgOwoKICByZXR1
cm4gMCA7Cn0K