+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>
* cp-lang.c (LANG_HOOKS_TRUTHVALUE_CONVERSION): Redefine.
/* Use EXTRACTOR to locate the relevant function called for each base &
class field of TYPE. CLIENT allows additional information to be passed
- to EXTRACTOR. Generates the union of all exceptions generated by
- those functions. */
+ to EXTRACTOR. Generates the union of all exceptions generated by those
+ 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
synthesize_exception_spec (type, extractor, client)
tree fields = TYPE_FIELDS (type);
int i, n_bases = CLASSTYPE_N_BASECLASSES (type);
tree binfos = TYPE_BINFO_BASETYPES (type);
-
+
for (i = 0; i != n_bases; i++)
{
tree base = BINFO_TYPE (TREE_VEC_ELT (binfos, i));
case sfk_assignment_operator:
{
struct copy_data data;
- tree argtype;
+ tree argtype = type;
has_parm = 1;
data.name = NULL;
if (const_p)
{
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),
get_identifier ("_ctor_arg"));
args = tree_cons (NULL_TREE, args, void_list_node);
--- /dev/null
+// 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 (...)
+ { }
+}