diff options
author | Jason Merrill <jason@redhat.com> | 2011-03-25 12:17:08 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2011-03-25 12:17:08 -0400 |
commit | 5ade176d5eb914bf78919ac2f610599059fba340 (patch) | |
tree | 6d637e3253d81a75c9cb50f2011950b451eff6da /gcc | |
parent | 7eda336814b5c8d3ed37b4f9055889c6651eb1bb (diff) | |
download | gcc-5ade176d5eb914bf78919ac2f610599059fba340.zip gcc-5ade176d5eb914bf78919ac2f610599059fba340.tar.gz gcc-5ade176d5eb914bf78919ac2f610599059fba340.tar.bz2 |
Core 1135
Core 1135
* method.c (defaulted_late_check): Check for exception spec mismatch.
(defaultable_fn_check): Allow exception spec and virtual.
* class.c (check_for_override): A virtual dtor is non-trivial.
From-SVN: r171462
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/class.c | 2 | ||||
-rw-r--r-- | gcc/cp/method.c | 15 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/defaulted15.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/defaulted22.C | 23 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/defaulted23.C | 27 |
7 files changed, 71 insertions, 9 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b9fb0cd..7a99acd 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,10 @@ 2011-03-25 Jason Merrill <jason@redhat.com> + Core 1135 + * method.c (defaulted_late_check): Check for exception spec mismatch. + (defaultable_fn_check): Allow exception spec and virtual. + * class.c (check_for_override): A virtual dtor is non-trivial. + PR c++/48289 * pt.c (build_non_dependent_expr): Keep dereferences outside the NON_DEPENDENT_EXPR. diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 1325260..adae51f 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -2474,6 +2474,8 @@ check_for_override (tree decl, tree ctype) if (!DECL_VINDEX (decl)) DECL_VINDEX (decl) = error_mark_node; IDENTIFIER_VIRTUAL_P (DECL_NAME (decl)) = 1; + if (DECL_DESTRUCTOR_P (decl)) + TYPE_HAS_NONTRIVIAL_DESTRUCTOR (ctype) = true; } } diff --git a/gcc/cp/method.c b/gcc/cp/method.c index 0366988..386a818 100644 --- a/gcc/cp/method.c +++ b/gcc/cp/method.c @@ -1554,6 +1554,12 @@ defaulted_late_check (tree fn) if (DECL_DEFAULTED_IN_CLASS_P (fn)) { tree eh_spec = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (implicit_fn)); + if (TYPE_RAISES_EXCEPTIONS (TREE_TYPE (fn)) + && !comp_except_specs (TYPE_RAISES_EXCEPTIONS (TREE_TYPE (fn)), + eh_spec, ce_normal)) + error ("function %q+D defaulted on its first declaration " + "with an exception-specification that differs from " + "the implicit declaration %q#D", fn, implicit_fn); TREE_TYPE (fn) = build_exception_variant (TREE_TYPE (fn), eh_spec); if (DECL_DECLARED_CONSTEXPR_P (implicit_fn)) /* Hmm...should we do this for out-of-class too? Should it be OK to @@ -1619,14 +1625,7 @@ defaultable_fn_check (tree fn) break; } if (TYPE_BEING_DEFINED (DECL_CONTEXT (fn))) - { - if (TYPE_RAISES_EXCEPTIONS (TREE_TYPE (fn))) - error ("function %q+D defaulted on its first declaration " - "must not have an exception-specification", fn); - if (DECL_VIRTUAL_P (fn)) - error ("%qD declared virtual cannot be defaulted in the class " - "body", fn); - } + /* Defer checking. */; else if (!processing_template_decl) defaulted_late_check (fn); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 57a7102..e2aab84 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,11 @@ 2011-03-25 Jason Merrill <jason@redhat.com> + * g++.dg/cpp0x/defaulted22.C: New. + * g++.dg/cpp0x/defaulted23.C: New. + * g++.dg/cpp0x/defaulted15.C: Adjust. + +2011-03-25 Jason Merrill <jason@redhat.com> + * g++.dg/cpp0x/move1.C: New. 2011-03-25 Ira Rosen <ira.rosen@linaro.org> diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted15.C b/gcc/testsuite/g++.dg/cpp0x/defaulted15.C index 4c5b11c..0a47c20 100644 --- a/gcc/testsuite/g++.dg/cpp0x/defaulted15.C +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted15.C @@ -54,5 +54,5 @@ struct G: public F struct H { - virtual ~H() = default; // { dg-error "declared virtual" } + virtual ~H() = default; }; diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted22.C b/gcc/testsuite/g++.dg/cpp0x/defaulted22.C new file mode 100644 index 0000000..61e9d32 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted22.C @@ -0,0 +1,23 @@ +// Test that a virtual defaulted constructor is still virtual. +// { dg-do run } +// { dg-options -std=c++0x } + +int r = 1; + +struct A +{ + virtual ~A() = default; +}; + +struct B: A +{ + ~B() noexcept { r = 0; } +}; + +A* ap = new B(); + +int main() +{ + delete ap; + return r; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted23.C b/gcc/testsuite/g++.dg/cpp0x/defaulted23.C new file mode 100644 index 0000000..5b4438d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted23.C @@ -0,0 +1,27 @@ +// Test for checking of exception specifications on defaulted fns +// { dg-options -std=c++0x } + +struct A +{ + A() noexcept = default; +}; + +struct B +{ + B() throw (int) = default; // { dg-error "exception-specification that differs from the implicit declaration" } +}; + +struct C +{ + C() throw (int) { } +}; + +struct D: C +{ + D() throw (int) = default; +}; + +struct E +{ + E() = default; +}; |