aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2018-02-15 17:01:33 -0500
committerJason Merrill <jason@gcc.gnu.org>2018-02-15 17:01:33 -0500
commitdd39c7d1cbdd55657b7ef773f6fa743dcc328670 (patch)
tree94dfb136fe2661f4ce4b54e2db0e656b27b34abf /gcc
parentf3ad8745b0559b3abc4253dbc3a659295b142379 (diff)
downloadgcc-dd39c7d1cbdd55657b7ef773f6fa743dcc328670.zip
gcc-dd39c7d1cbdd55657b7ef773f6fa743dcc328670.tar.gz
gcc-dd39c7d1cbdd55657b7ef773f6fa743dcc328670.tar.bz2
PR c++/84045 - ICE with typedef and noexcept.
* except.c (build_noexcept_spec): Use strip_typedefs_expr. From-SVN: r257713
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog3
-rw-r--r--gcc/cp/except.c4
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/noexcept32.C14
3 files changed, 21 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 5807374..33746ae 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,8 @@
2018-02-15 Jason Merrill <jason@redhat.com>
+ PR c++/84045 - ICE with typedef and noexcept.
+ * except.c (build_noexcept_spec): Use strip_typedefs_expr.
+
PR c++/84376 - ICE with omitted template arguments.
* pt.c (dguide_name_p): Check for IDENTIFIER_NODE.
diff --git a/gcc/cp/except.c b/gcc/cp/except.c
index 669bf9f..0b46698 100644
--- a/gcc/cp/except.c
+++ b/gcc/cp/except.c
@@ -1217,6 +1217,10 @@ build_noexcept_spec (tree expr, int complain)
{
gcc_assert (processing_template_decl
|| TREE_CODE (expr) == DEFERRED_NOEXCEPT);
+ if (TREE_CODE (expr) != DEFERRED_NOEXCEPT)
+ /* Avoid problems with a function type built with a dependent typedef
+ being reused in another scope (c++/84045). */
+ expr = strip_typedefs_expr (expr);
return build_tree_list (expr, NULL_TREE);
}
}
diff --git a/gcc/testsuite/g++.dg/cpp0x/noexcept32.C b/gcc/testsuite/g++.dg/cpp0x/noexcept32.C
new file mode 100644
index 0000000..9a43504
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/noexcept32.C
@@ -0,0 +1,14 @@
+// PR c++/84045
+// { dg-do compile { target c++11 } }
+
+template <typename T> struct K {
+ static const bool d = true;
+};
+template <typename T, typename> struct B {
+ typedef K<T> D;
+ void foo () noexcept (D::d);
+};
+template <typename T> struct P {
+ P () noexcept (K<T>::d);
+};
+P<int> p;