diff options
author | Jason Merrill <jason@redhat.com> | 2011-10-02 17:44:52 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2011-10-02 17:44:52 -0400 |
commit | f10eaa2dcc0081c7abbc326b500b84e03f777d05 (patch) | |
tree | 1eb84d79741501950988c6ec9cd85a6956dcb7a0 /gcc | |
parent | 3bf108578e7f46273be8dbc35797d5e7ad4b2336 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/class.c | 11 | ||||
-rw-r--r-- | gcc/cp/method.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/nsdmi5.C | 20 |
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; +} |