diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e9173050249..a605c9fc32d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2011-10-02 Jason Merrill + + * class.c (fixed_type_or_null): Handle NSDMI. + * method.c (walk_field_subobs): Disable NSDMI noexcept checking + for now. + 2011-09-30 Jason Merrill * cp-tree.h (TREE_NEGATED_INT): Remove. diff --git a/gcc/cp/class.c b/gcc/cp/class.c index a7d8218055f..2df9177e47e 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 1316dfb6a83..f4a3ea6ac99 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 0f09e0f58f8..c4cadf732bf 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2011-10-02 Jason Merrill + + * g++.dg/cpp0x/nsdmi5.C: New. + 2011-10-02 Richard Sandiford 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 00000000000..62803b0819e --- /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 struct Z : T +{ + int y = this->f(); +}; +int main() +{ + Y foo; + Z bar; +}