aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorKamlesh Kumar <kamleshbhalui@gmail.com>2018-11-16 21:55:00 +0000
committerJason Merrill <jason@gcc.gnu.org>2018-11-16 16:55:00 -0500
commit205d542ad55d8dee50acfe4f8ff6c2138dbad418 (patch)
tree51f4aa19896dd1fcc42f9d78516587d83305621a /gcc
parent2674fa47de9ecfee5b04f753582fb23041029f40 (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--gcc/cp/parser.c9
-rw-r--r--gcc/testsuite/g++.dg/DRs/dr1207-1.C23
-rw-r--r--gcc/testsuite/g++.dg/DRs/dr1207-2.C12
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;
+}