diff options
author | Kamlesh Kumar <kamleshbhalui@gmail.com> | 2018-11-16 21:55:00 +0000 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2018-11-16 16:55:00 -0500 |
commit | 205d542ad55d8dee50acfe4f8ff6c2138dbad418 (patch) | |
tree | 51f4aa19896dd1fcc42f9d78516587d83305621a /gcc | |
parent | 2674fa47de9ecfee5b04f753582fb23041029f40 (diff) | |
download | gcc-205d542ad55d8dee50acfe4f8ff6c2138dbad418.zip gcc-205d542ad55d8dee50acfe4f8ff6c2138dbad418.tar.gz gcc-205d542ad55d8dee50acfe4f8ff6c2138dbad418.tar.bz2 |
re PR c++/52869 ([DR 1207] "this" not being allowed in noexcept clauses)
PR c++/52869
DR 1207
* parser.c (cp_parser_noexcept_specification_opt): Call
inject_this_parameter.
From-SVN: r266224
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/parser.c | 9 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/DRs/dr1207-1.C | 23 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/DRs/dr1207-2.C | 12 |
4 files changed, 51 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index d0a344e..6d99d6a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2018-11-16 Kamlesh Kumar <kamleshbhalui@gmail.com> + + DR 1207 + PR c++/52869 + * parser.c (cp_parser_noexcept_specification_opt): Call + inject_this_parameter. + 2018-11-16 Jason Merrill <jason@redhat.com> Implement P0479R5, [[likely]] and [[unlikely]]. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 215c5fb..88fc426 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -24668,6 +24668,12 @@ cp_parser_noexcept_specification_opt (cp_parser* parser, matching_parens parens; parens.consume_open (parser); + tree save_ccp = current_class_ptr; + tree save_ccr = current_class_ref; + + if (current_class_type) + inject_this_parameter (current_class_type, TYPE_UNQUALIFIED); + if (require_constexpr) { /* Types may not be defined in an exception-specification. */ @@ -24687,6 +24693,9 @@ cp_parser_noexcept_specification_opt (cp_parser* parser, } parens.require_close (parser); + + current_class_ptr = save_ccp; + current_class_ref = save_ccr; } else { diff --git a/gcc/testsuite/g++.dg/DRs/dr1207-1.C b/gcc/testsuite/g++.dg/DRs/dr1207-1.C new file mode 100644 index 0000000..16fce84 --- /dev/null +++ b/gcc/testsuite/g++.dg/DRs/dr1207-1.C @@ -0,0 +1,23 @@ +// DR 1207 +// PR c++/52869 +// { dg-do compile { target c++11 } } + +struct S { + void f() { } + void g() noexcept(noexcept(f())) { } + void h() noexcept(noexcept(this->f())) { } +}; + +struct Nyan { + Nyan &operator++() noexcept { return *this; } + void omg() noexcept(noexcept(++*this)) {} +}; + +template <class T> +class Test{ + T count; + Test (T arg) {count=arg;} + void fetch() { } + T inc () noexcept(noexcept(this->fetch())) {return ++count;} + T dec () noexcept(noexcept(fetch())) { return --count;} +}; diff --git a/gcc/testsuite/g++.dg/DRs/dr1207-2.C b/gcc/testsuite/g++.dg/DRs/dr1207-2.C new file mode 100644 index 0000000..2d54748 --- /dev/null +++ b/gcc/testsuite/g++.dg/DRs/dr1207-2.C @@ -0,0 +1,12 @@ +// DR 1207 +// PR c++/52869 +// { dg-do compile { target c++11 } } + +void +fn () +{ + struct S { + bool operator!() noexcept(false); + } s; + S t = s; +} |