Commit f62ea157 by Jason Merrill Committed by Jason Merrill

re PR c++/6179 (EH regression test failure for STLport-4.5.3)

        PR c++/6179
        * method.c (implicitly_declare_fn): Pass unqualified type to
        synthesize_exception_spec.

From-SVN: r51954
parent 8e9603b0
2002-04-06 Jason Merrill <jason@redhat.com>
PR c++/6179
* method.c (implicitly_declare_fn): Pass unqualified type to
synthesize_exception_spec.
2002-04-04 Neil Booth <neil@daikokuya.demon.co.uk> 2002-04-04 Neil Booth <neil@daikokuya.demon.co.uk>
* cp-lang.c (LANG_HOOKS_TRUTHVALUE_CONVERSION): Redefine. * cp-lang.c (LANG_HOOKS_TRUTHVALUE_CONVERSION): Redefine.
......
...@@ -770,8 +770,9 @@ synthesize_method (fndecl) ...@@ -770,8 +770,9 @@ synthesize_method (fndecl)
/* Use EXTRACTOR to locate the relevant function called for each base & /* Use EXTRACTOR to locate the relevant function called for each base &
class field of TYPE. CLIENT allows additional information to be passed class field of TYPE. CLIENT allows additional information to be passed
to EXTRACTOR. Generates the union of all exceptions generated by to EXTRACTOR. Generates the union of all exceptions generated by those
those functions. */ functions. Note that we haven't updated TYPE_FIELDS and such of any
variants yet, so we need to look at the main one. */
static tree static tree
synthesize_exception_spec (type, extractor, client) synthesize_exception_spec (type, extractor, client)
...@@ -783,7 +784,7 @@ synthesize_exception_spec (type, extractor, client) ...@@ -783,7 +784,7 @@ synthesize_exception_spec (type, extractor, client)
tree fields = TYPE_FIELDS (type); tree fields = TYPE_FIELDS (type);
int i, n_bases = CLASSTYPE_N_BASECLASSES (type); int i, n_bases = CLASSTYPE_N_BASECLASSES (type);
tree binfos = TYPE_BINFO_BASETYPES (type); tree binfos = TYPE_BINFO_BASETYPES (type);
for (i = 0; i != n_bases; i++) for (i = 0; i != n_bases; i++)
{ {
tree base = BINFO_TYPE (TREE_VEC_ELT (binfos, i)); tree base = BINFO_TYPE (TREE_VEC_ELT (binfos, i));
...@@ -962,7 +963,7 @@ implicitly_declare_fn (kind, type, const_p) ...@@ -962,7 +963,7 @@ implicitly_declare_fn (kind, type, const_p)
case sfk_assignment_operator: case sfk_assignment_operator:
{ {
struct copy_data data; struct copy_data data;
tree argtype; tree argtype = type;
has_parm = 1; has_parm = 1;
data.name = NULL; data.name = NULL;
...@@ -978,10 +979,10 @@ implicitly_declare_fn (kind, type, const_p) ...@@ -978,10 +979,10 @@ implicitly_declare_fn (kind, type, const_p)
if (const_p) if (const_p)
{ {
data.quals = TYPE_QUAL_CONST; data.quals = TYPE_QUAL_CONST;
type = build_qualified_type (type, TYPE_QUAL_CONST); argtype = build_qualified_type (argtype, TYPE_QUAL_CONST);
} }
argtype = build_reference_type (type); argtype = build_reference_type (argtype);
args = build_tree_list (hash_tree_chain (argtype, NULL_TREE), args = build_tree_list (hash_tree_chain (argtype, NULL_TREE),
get_identifier ("_ctor_arg")); get_identifier ("_ctor_arg"));
args = tree_cons (NULL_TREE, args, void_list_node); args = tree_cons (NULL_TREE, args, void_list_node);
......
// PR c++/6179
// Bug: we tried to look at the fields of 'const A' to determine the proper
// exception specification for the synthesized copy constructor, but
// TYPE_FIELDS hadn't been set yet, so we incorrectly got a throw() spec.
struct B
{
B () {}
B (const B&) { throw 1; }
};
struct A;
void f (const A &) {}
struct A
{
B b;
};
int main ()
{
A a;
try
{ A a2 (a); }
catch (...)
{ }
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment