]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PR c++/90490 - fix decltype issues in noexcept-specifier.
authorMarek Polacek <polacek@redhat.com>
Tue, 2 Jul 2019 00:23:41 +0000 (00:23 +0000)
committerMarek Polacek <mpolacek@gcc.gnu.org>
Tue, 2 Jul 2019 00:23:41 +0000 (00:23 +0000)
* except.c (build_noexcept_spec): Call
instantiate_non_dependent_expr_sfinae before
build_converted_constant_expr instead of calling
instantiate_non_dependent_expr after it.  Add
processing_template_decl_sentinel.

* g++.dg/cpp0x/noexcept43.C: New test.
* g++.dg/cpp0x/noexcept44.C: New test.

From-SVN: r272918

gcc/cp/ChangeLog
gcc/cp/except.c
gcc/testsuite/g++.dg/cpp0x/noexcept43.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp0x/noexcept44.C [new file with mode: 0644]

index 50e187be21a9072157c14defc328f00de330d869..6d2f73106baee86f70c3ba2b4441e66713be23d8 100644 (file)
@@ -6,6 +6,13 @@
        PR c++/60223 - ICE with T{} in non-deduced context.
        * pt.c (unify): Allow COMPOUND_LITERAL_P in a non-deduced context.
 
+       PR c++/90490 - fix decltype issues in noexcept-specifier.
+       * except.c (build_noexcept_spec): Call
+       instantiate_non_dependent_expr_sfinae before
+       build_converted_constant_expr instead of calling
+       instantiate_non_dependent_expr after it.  Add
+       processing_template_decl_sentinel.
+
 2019-06-29  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
index afc261073d73dda30f7c63e69730997da575bd92..03a9c8e53c74fba1432dca3fde6175de48303661 100644 (file)
@@ -1288,8 +1288,10 @@ build_noexcept_spec (tree expr, tsubst_flags_t complain)
   if (TREE_CODE (expr) != DEFERRED_NOEXCEPT
       && !value_dependent_expression_p (expr))
     {
+      expr = instantiate_non_dependent_expr_sfinae (expr, complain);
+      /* Don't let convert_like_real create more template codes.  */
+      processing_template_decl_sentinel s;
       expr = build_converted_constant_bool_expr (expr, complain);
-      expr = instantiate_non_dependent_expr (expr);
       expr = cxx_constant_value (expr);
     }
   if (TREE_CODE (expr) == INTEGER_CST)
diff --git a/gcc/testsuite/g++.dg/cpp0x/noexcept43.C b/gcc/testsuite/g++.dg/cpp0x/noexcept43.C
new file mode 100644 (file)
index 0000000..faa7d14
--- /dev/null
@@ -0,0 +1,10 @@
+// PR c++/90490
+// { dg-do compile { target c++11 } }
+
+struct R { constexpr operator bool() { return false;} };
+
+template <typename>
+struct S {
+  void g() noexcept(decltype(R{ }) { }) {
+  }
+};
diff --git a/gcc/testsuite/g++.dg/cpp0x/noexcept44.C b/gcc/testsuite/g++.dg/cpp0x/noexcept44.C
new file mode 100644 (file)
index 0000000..78c9d12
--- /dev/null
@@ -0,0 +1,8 @@
+// PR c++/90490
+// { dg-do compile { target c++11 } }
+
+template <typename>
+struct S {
+  void g() noexcept(decltype(int{ }) { }) {
+  }
+};