------- Comment #1 from raymond at corvil dot com  2007-08-07 17:59 -------
I have been able to reproduce the same ICE in 3.4.2,

    gcc version 3.4.2 20040827 (prerelease) [FreeBSD]

but not in 2.95.4 or 4.1.2:

    gcc version 2.95.4 20020320 [FreeBSD]
    gcc version 4.1.2 (Ubuntu 4.1.2-0ubuntu4)


I originally found the ICE in some code that was throwing a copy of an object
in a std::vector on the stack.  By playing around with the test code I posted,
I found that it seems to trigger only when the following three conditions occur
together:

* the copy is directly thrown, and not when the a copy is declared on the stack
and then thrown;
* the method that provides the reference to be copied has a return-type deduced
from a traits template;
* the class of the object being thrown does not provide a copy-constructor.

I've tried to illustrate in the full test case that, if any one of these
conditions is false, then the ICE doesn't happen.


The following shorter test-case also triggers the error.  I know it includes a
standard header, and I haven't provided pre-processed sources for this, but
it's just for illustration purposes.

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
#include <vector>

/*
 * inner() throws a copy of an object contained in a vector.
 * It's templated to show what happens with different _Types.
 */

template<typename _Type>
void    inner()
{
        typename std::vector<_Type> vector(1);
        throw _Type(*vector.begin());
}


struct Generated { };

struct Manual {
        Manual() { }
        Manual(const Manual&) { }
};


void    outer()
{
// No problems when the class has a hand-written copy-constructor:
        inner<Manual>();

// ICE when the class has a compiler-supplied copy-constructor:
        inner<Generated>();
}

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33012

Reply via email to