[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#491137: Small example to reproduce the bug



found 491137 4.3.3-1
thanks

Finally I got around to produce a tiny example from the original code that
reproduces the bug. The attached code contains several notes on which parts seem
to be essential (e.g., using ::std::string in some way). To reproduce do

g++ -g -O2 -o invariance_annotation invariance_annotation.preproc.cpp
./invariance_annotation

vs.

g++ -g -O2 -DVOLATILE -o invariance_annotation invariance_annotation.preproc.cpp
./invariance_annotation

All experiments were done in the sid chroot on zelenka.d.o.

Hope this helps,
Michael

// try:
// g++ -O2 -o invariance_annotation invariance_annotation.preproc.cpp  ; ./invariance_annotation
// g++ -O2 -DVOLATILE -o invariance_annotation invariance_annotation.preproc.cpp  ; ./invariance_annotation
// Was fine on g++ 4.2, only happens on s390; adding -g does not change the behaviour

struct Dummy_Class_With_Invariance;

struct Class_Invariance_Guard_Throw
{
	explicit Class_Invariance_Guard_Throw(Dummy_Class_With_Invariance  *  object);
	~Class_Invariance_Guard_Throw();
	Dummy_Class_With_Invariance  & m_object;
};

struct Dummy_Class_With_Invariance
{
	void method_with_return(bool  t1, bool  t2)
	{
		m_class_invariance_called=0;
		m_throw=t1;
		Class_Invariance_Guard_Throw internal__invariance_guard(this); 
		m_throw=t2;
		return;
		// internal__invariance_guard is destructed at this point and must thus call m_class_invariance
	}
	void m_class_invariance() 
	{
		++m_class_invariance_called;
		if(m_throw) throw "Invariance throwing";
	}

	int m_class_invariance_called;
#ifdef VOLATILE
	volatile
#endif
		bool m_throw;
};

Class_Invariance_Guard_Throw::Class_Invariance_Guard_Throw(Dummy_Class_With_Invariance  *  object)
: m_object(*object)
{
	(m_object.m_class_invariance)();
}

Class_Invariance_Guard_Throw::~Class_Invariance_Guard_Throw() {
	(m_object.m_class_invariance)();
}

#include <string>

int main()
{
	Dummy_Class_With_Invariance d;
	d.method_with_return(false,false);
	if(!(d.m_class_invariance_called==2)) { 
		// use of ::std::string or other class (implicitly) building a string from the argument 
		// required to cause the error
		throw ::std::string("d.m_class_invariance_called==2"); 
	} 
	d.method_with_return(false,false);
	if(!(d.m_class_invariance_called==2)) { 
		// use of ::std::string or other class (implicitly) building a string from the argument 
		// required to cause the error
		throw ::std::string("d.m_class_invariance_called==2"); 
	} 
	try {
		d.method_with_return(false,true);
		printf("Missing exception\n");
	} catch(...) { 
		printf("Ok\n");
	} 
}

Attachment: pgpypsa3oxw1n.pgp
Description: PGP signature


Reply to: