This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/30434] New: wrong parse of exception declaration list in virtual functions with multiple inheritence
- From: "florent_teichteil at yahoo dot fr" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 11 Jan 2007 11:14:09 -0000
- Subject: [Bug c++/30434] New: wrong parse of exception declaration list in virtual functions with multiple inheritence
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
The C++ standard allows to add exceptions to the list of throwable exceptions
in virtual functions. But this does not work with multiple inheritence, as the
following example shows:
// CODE BEGIN
#include <string>
#include <vector>
#include <iostream>
#include <exception>
class my_exception
{
protected :
std::string error_message_;
public :
my_exception(std::string const & error_message)
:error_message_(error_message) {}
virtual ~my_exception() throw() {}
std::string const & what() const throw() {return error_message_;}
};
template <class T>
class A
{
protected :
T obj_;
public :
A(T const & obj) :obj_(obj) {}
virtual ~A() {}
virtual std::string get_obj_type() const =0;
};
class B : public A<std::string>
{
public :
B(std::string const & obj) :A<std::string>(obj) {}
virtual ~B() {}
virtual std::string get_obj_type() const throw(std::exception) {return
"string";}
};
class C : public A<std::vector<int> >
{
public :
C(std::vector<int> const & obj) :A<std::vector<int> >(obj) {}
virtual ~C() {}
virtual std::string get_obj_type() const throw(std::exception) {return
"vector<int>";}
};
class D : public B, public C
{
public :
D(std::string const & obj1, std::vector<int> const & obj2) :B(obj1),
C(obj2) {}
virtual ~D() {}
virtual std::string get_obj_type() const
throw(std::exception,my_exception)
{
throw my_exception("which object?");
return 0;
}
};
int main(int argc, char ** argv)
{
D d("stupid string", std::vector<int>());
try
{
std::cout << "type: " << d.get_obj_type() << std::endl;
}
catch (my_exception const & error)
{
std::cerr << error.what() << std::endl;
return -1;
}
return 0;
}
// CODE END
The compilation result is:
test_bis.cc:60: error: looser throw specifier for ?virtual std::string
D::get_obj_type() const throw (std::exception, my_exception)?
test_bis.cc:40: error: overriding ?virtual std::string B::get_obj_type()
const throw (std::exception)?
I have no error when D only inherits from either B or C.
--
Summary: wrong parse of exception declaration list in virtual
functions with multiple inheritence
Product: gcc
Version: 4.1.2
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: florent_teichteil at yahoo dot fr
GCC build triplet: amd64 (x86_64)
GCC host triplet: amd64 (x86_64)
GCC target triplet: amd64 (x86_64)
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30434