aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2011-10-02 17:44:52 -0400
committerJason Merrill <jason@gcc.gnu.org>2011-10-02 17:44:52 -0400
commitf10eaa2dcc0081c7abbc326b500b84e03f777d05 (patch)
tree1eb84d79741501950988c6ec9cd85a6956dcb7a0 /gcc
parent3bf108578e7f46273be8dbc35797d5e7ad4b2336 (diff)
downloadgcc-f10eaa2dcc0081c7abbc326b500b84e03f777d05.zip
gcc-f10eaa2dcc0081c7abbc326b500b84e03f777d05.tar.gz
gcc-f10eaa2dcc0081c7abbc326b500b84e03f777d05.tar.bz2
class.c (fixed_type_or_null): Handle NSDMI.
* class.c (fixed_type_or_null): Handle NSDMI. * method.c (walk_field_subobs): Disable NSDMI noexcept checking for now. From-SVN: r179435
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/class.c11
-rw-r--r--gcc/cp/method.c8
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/nsdmi5.C20
5 files changed, 43 insertions, 6 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index e917305..a605c9f 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2011-10-02 Jason Merrill <jason@redhat.com>
+
+ * class.c (fixed_type_or_null): Handle NSDMI.
+ * method.c (walk_field_subobs): Disable NSDMI noexcept checking
+ for now.
+
2011-09-30 Jason Merrill <jason@redhat.com>
* cp-tree.h (TREE_NEGATED_INT): Remove.
diff --git a/gcc/cp/class.c b/gcc/cp/class.c
index a7d8218..2df9177 100644
--- a/gcc/cp/class.c
+++ b/gcc/cp/class.c
@@ -6062,10 +6062,13 @@ fixed_type_or_null (tree instance, int *nonnull, int *cdtorp)
if (nonnull)
*nonnull = 1;
- /* if we're in a ctor or dtor, we know our type. */
- if (DECL_LANG_SPECIFIC (current_function_decl)
- && (DECL_CONSTRUCTOR_P (current_function_decl)
- || DECL_DESTRUCTOR_P (current_function_decl)))
+ /* if we're in a ctor or dtor, we know our type. If
+ current_class_ptr is set but we aren't in a function, we're in
+ an NSDMI (and therefore a constructor). */
+ if (current_scope () != current_function_decl
+ || (DECL_LANG_SPECIFIC (current_function_decl)
+ && (DECL_CONSTRUCTOR_P (current_function_decl)
+ || DECL_DESTRUCTOR_P (current_function_decl))))
{
if (cdtorp)
*cdtorp = 1;
diff --git a/gcc/cp/method.c b/gcc/cp/method.c
index 1316dfb..f4a3ea6 100644
--- a/gcc/cp/method.c
+++ b/gcc/cp/method.c
@@ -1042,12 +1042,16 @@ walk_field_subobs (tree fields, tree fnname, special_function_kind sfk,
inform (0, "initializer for %q+#D is invalid", field);
if (trivial_p)
*trivial_p = false;
+#if 0
/* Core 1351: If the field has an NSDMI that could throw, the
default constructor is noexcept(false). FIXME this is
- broken by deferred parsing and 1360 saying we can't
- lazily declare a non-trivial default constructor. */
+ broken by deferred parsing and 1360 saying we can't lazily
+ declare a non-trivial default constructor. Also this
+ needs to do deferred instantiation. Disable until the
+ conflict between 1351 and 1360 is resolved. */
if (spec_p && !expr_noexcept_p (DECL_INITIAL (field), complain))
*spec_p = noexcept_false_spec;
+#endif
/* Don't do the normal processing. */
continue;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 0f09e0f..c4cadf7 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2011-10-02 Jason Merrill <jason@redhat.com>
+
+ * g++.dg/cpp0x/nsdmi5.C: New.
+
2011-10-02 Richard Sandiford <rdsandiford@googlemail.com>
PR target/50579
diff --git a/gcc/testsuite/g++.dg/cpp0x/nsdmi5.C b/gcc/testsuite/g++.dg/cpp0x/nsdmi5.C
new file mode 100644
index 0000000..62803b0
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/nsdmi5.C
@@ -0,0 +1,20 @@
+// { dg-options -std=c++0x }
+
+struct X
+{
+ int x = 5;
+ int f() { return x; }
+};
+struct Y : X
+{
+ int y = this->x;
+};
+template <class T> struct Z : T
+{
+ int y = this->f();
+};
+int main()
+{
+ Y foo;
+ Z<X> bar;
+}