From aec6f2803a6dbe0eeafc03883acad95c0f4131da Mon Sep 17 00:00:00 2001 From: Markus Trippelsdorf Date: Fri, 4 Dec 2015 11:46:39 +0000 Subject: [PATCH] Fix c++/67337 (segfault in mangle.c) PR c++/67337 * mangle.c (write_template_prefix): Guard against context==NULL. From-SVN: r231258 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/mangle.c | 2 +- gcc/testsuite/g++.dg/template/pr67337.C | 25 +++++++++++++++++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/template/pr67337.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 8fe4ac59b5f3..ed260f14b400 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2015-12-04 Markus Trippelsdorf + + PR c++/67337 + * mangle.c (write_template_prefix): Guard against context==NULL. + 2015-08-17 Jason Merrill PR c++/66957 diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c index c9b1c5f8eb07..3a22b0dc5841 100644 --- a/gcc/cp/mangle.c +++ b/gcc/cp/mangle.c @@ -1118,7 +1118,7 @@ write_template_prefix (const tree node) So, for the example above, `Outer::Inner' is represented as a substitution candidate by a TREE_LIST whose purpose is `Outer' and whose value is `Outer::Inner'. */ - if (TYPE_P (context)) + if (context && TYPE_P (context)) substitution = build_tree_list (context, templ); else substitution = templ; diff --git a/gcc/testsuite/g++.dg/template/pr67337.C b/gcc/testsuite/g++.dg/template/pr67337.C new file mode 100644 index 000000000000..df2651bc9a57 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/pr67337.C @@ -0,0 +1,25 @@ +template class A +{ + void m_fn1 (int *, int); +}; + +template class B +{ +public: + typedef int Type; +}; + +template class C +{ +public: + C (int); + template