aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2014-06-30 14:51:29 -0400
committerJason Merrill <jason@gcc.gnu.org>2014-06-30 14:51:29 -0400
commitcae7c96095c645003b25e1b69bee46ade7fce344 (patch)
tree0afc62b27294c1b4d7e94bac36e99f94358d3499
parent1d7e2ec760cc5512747ab054765eca101fc49dc6 (diff)
downloadgcc-cae7c96095c645003b25e1b69bee46ade7fce344.zip
gcc-cae7c96095c645003b25e1b69bee46ade7fce344.tar.gz
gcc-cae7c96095c645003b25e1b69bee46ade7fce344.tar.bz2
re PR c++/61566 (ICE in write_unscoped_name)
PR c++/61566 * mangle.c (decl_mangling_context): Look through a TEMPLATE_DECL. From-SVN: r212165
-rw-r--r--gcc/cp/ChangeLog3
-rw-r--r--gcc/cp/mangle.c4
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template13.C20
3 files changed, 27 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index e925e13..122cf8a 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,8 @@
2014-06-30 Jason Merrill <jason@redhat.com>
+ PR c++/61566
+ * mangle.c (decl_mangling_context): Look through a TEMPLATE_DECL.
+
* decl.c (build_ptrmemfunc_type): Don't give a PMF RECORD_TYPE
TYPE_BINFO or TYPE_LANG_SPECIFIC.
* cp-tree.h (TYPE_PTRMEMFUNC_FLAG): Use TYPE_LANG_FLAG_2.
diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c
index ac1c1da..02c05d4 100644
--- a/gcc/cp/mangle.c
+++ b/gcc/cp/mangle.c
@@ -742,6 +742,10 @@ decl_mangling_context (tree decl)
if (tcontext != NULL_TREE)
return tcontext;
+ if (TREE_CODE (decl) == TEMPLATE_DECL
+ && DECL_TEMPLATE_RESULT (decl))
+ decl = DECL_TEMPLATE_RESULT (decl);
+
if (TREE_CODE (decl) == TYPE_DECL
&& LAMBDA_TYPE_P (TREE_TYPE (decl)))
{
diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template13.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template13.C
new file mode 100644
index 0000000..adbb4db
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template13.C
@@ -0,0 +1,20 @@
+// PR c++/61566
+// { dg-do compile { target c++11 } }
+
+struct function
+{
+ template < typename _Functor>
+ function (_Functor);
+};
+
+struct C
+{
+ template <typename T>
+ void foo (T, function = [] {});
+};
+
+void bar ()
+{
+ C c;
+ c.foo (1);
+}