This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

c++/868: Macro && template class && member argument == ICE



>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

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]