+2011-02-15 Jason Merrill <jason@redhat.com>
+
+ PR c++/46807
+ * method.c (synthesized_method_walk): Always exit early for
+ trivial fn in C++98 mode.
+
2011-02-14 Jason Merrill <jason@redhat.com>
PR c++/47482
if (trivial_p)
*trivial_p = expected_trivial;
-#ifndef ENABLE_CHECKING
/* The TYPE_HAS_COMPLEX_* flags tell us about constraints from base
class versions and other properties of the type. But a subobject
class can be trivially copyable and yet have overload resolution
choose a template constructor for initialization, depending on
rvalueness and cv-quals. So we can't exit early for copy/move
- methods in C++0x. */
+ methods in C++0x. The same considerations apply in C++98/03, but
+ there the definition of triviality does not consider overload
+ resolution, so a constructor can be trivial even if it would otherwise
+ call a non-trivial constructor. */
if (expected_trivial
&& (!copy_arg_p || cxx_dialect < cxx0x))
{
*constexpr_p = synthesized_default_constructor_is_constexpr (ctype);
return;
}
-#endif
++cp_unevaluated_operand;
++c_inhibit_evaluation_warnings;
if (spec_p)
*spec_p = merge_exception_specifiers (*spec_p, cleanup_spec);
}
-
-#ifdef ENABLE_CHECKING
- /* If we expected this to be trivial but it isn't, then either we're in
- C++0x mode and this is a copy/move ctor/op= or there's an error. */
- gcc_assert (!(trivial_p && expected_trivial && !*trivial_p)
- || (copy_arg_p && cxx_dialect >= cxx0x)
- || errorcount);
-#endif
}
/* DECL is a deleted function. If it's implicitly deleted, explain why and
--- /dev/null
+// PR c++/46807
+// { dg-options -std=c++0x }
+// In C++98/03, B::B(const B&) is trivial because A::A(const A&) is trivial,
+// even though doing overload resolution would mean calling the template
+// constructor. In C++0x, we do overload resolution to determine triviality.
+
+struct A
+{
+ A() {}
+private:
+ template <class T> A(T&); // { dg-error "private" }
+};
+
+struct B // { dg-error "implicitly deleted|this context" }
+{
+ mutable A a;
+};
+
+int main()
+{
+ B b;
+ B b2(b); // { dg-error "deleted" }
+}
--- /dev/null
+// PR c++/46807
+// { dg-options -std=c++98 }
+// In C++98/03, B::B(const B&) is trivial because A::A(const A&) is trivial,
+// even though doing overload resolution would mean calling the template
+// constructor. In C++0x, we do overload resolution to determine triviality.
+
+struct A
+{
+ A() {}
+private:
+ template <class T> A(T&);
+};
+
+struct B
+{
+ mutable A a;
+};
+
+int main()
+{
+ B b;
+ B b2(b);
+}