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]

Minor exception bug with unexpected


Version:
i586-pc-linux-gnulibc1/egcs-2.91.13
gcc version egcs-2.91.13 980308 (gcc-2.8.0 release)

The appended example dumps core in __check_eh_spec. Although that
is legal in CD2 [except.special says "The unexpected() function shall 
not return"], it is still not very nice to the user. The patch 
makes unexpected() call terminate() in this case.


Thu Mar 19 03:38:17 1998  Andi Kleen  <ak@muc.de>

	* exception.cc (unexpected): Call terminate if the unexpected
	handler returns.
	(__default_unexpected): No need to call terminate here now.


*** gcc/cp/exception.cc-o	Thu Mar 19 03:31:33 1998
--- gcc/cp/exception.cc	Thu Mar 19 03:32:25 1998
***************
*** 43,53 ****
  }
  
  void
  __default_unexpected ()
  {
-   terminate ();
  }
  
  static unexpected_handler __unexpected_func __attribute__((__noreturn__))
    = __default_unexpected;
  
--- 43,52 ----
***************
*** 71,80 ****
--- 70,80 ----
  
  void
  unexpected ()
  {
    __unexpected_func ();
+   terminate(); 
  }
  
  /* C++-specific state about the current exception.
     This must match init_exception_processing().
  

Example:

#include <exception>
#include <stdio.h>
using namespace std;

class Bla { 
	const char *msg;
public:
	Bla(const char *m = "") { msg = m; } 
	const char *what() { return msg; } 
}; 

// make sure that is not inlined!
void f_ue();

void f() throw()
{
	f_ue();
}

void f_ue()
{
	throw Bla("f_ue"); 
} 

void myerr()
{
	printf("unexpected exception\n"); 
	// not standard conforming - does return.
}

main()
{	
	set_unexpected(myerr);
	f(); 
}


-Andi



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