aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAdam Butcher <adam@jessamine.co.uk>2014-02-25 06:44:53 +0000
committerAdam Butcher <abutcher@gcc.gnu.org>2014-02-25 06:44:53 +0000
commitadbdb8c76e9757634a688b093f6567d67b8b2498 (patch)
treec2838aa8b9eef42ed0aad12b7836de6d2a668112 /gcc
parent41b2d514d0fc40c9abf744e392e3f7f16fa610aa (diff)
downloadgcc-adbdb8c76e9757634a688b093f6567d67b8b2498.zip
gcc-adbdb8c76e9757634a688b093f6567d67b8b2498.tar.gz
gcc-adbdb8c76e9757634a688b093f6567d67b8b2498.tar.bz2
re PR c++/60311 ([c++1y] ICE with pointer-to-function with auto parameter)
Fix PR c++/60311. PR c++/60311 * parser.c (function_being_declared_is_template_p): Return false when processing a template parameter list. (cp_parser_parameter_declaration_clause): Don't set auto_is_implicit_function_template_parm_p when processing a template parameter list. PR c++/60311 * g++.dg/cpp1y/pr60311.C: New testcase. From-SVN: r208111
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/parser.c4
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/pr60311.C15
4 files changed, 27 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index fa6b3cf..5afc6d8 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,12 @@
2014-02-25 Adam Butcher <adam@jessamine.co.uk>
+ PR c++/60311
+ * parser.c (function_being_declared_is_template_p): Return false when
+ processing a template parameter list.
+ (cp_parser_parameter_declaration_clause): Don't set
+ auto_is_implicit_function_template_parm_p when processing a
+ template parameter list.
+
* parser.c (synthesize_implicit_template_parm): Inject new template
argument list appropriately when a generic member function
of a class template is declared out-of-line.
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 2d7918c..ef36327 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -18122,7 +18122,7 @@ cp_parser_type_specifier_seq (cp_parser* parser,
static bool
function_being_declared_is_template_p (cp_parser* parser)
{
- if (!current_template_parms)
+ if (!current_template_parms || processing_template_parmlist)
return false;
if (parser->implicit_template_scope)
@@ -18165,7 +18165,7 @@ cp_parser_parameter_declaration_clause (cp_parser* parser)
(void) cleanup;
- if (!processing_specialization)
+ if (!processing_specialization && !processing_template_parmlist)
if (!current_function_decl
|| (current_class_type && LAMBDA_TYPE_P (current_class_type)))
parser->auto_is_implicit_function_template_parm_p = true;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index d59f4ec..d8d760a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,8 @@
2014-02-25 Adam Butcher <adam@jessamine.co.uk>
+ PR c++/60311
+ * g++.dg/cpp1y/pr60311.C: New testcase.
+
* g++.dg/cpp1y/fn-generic-member-ool.C: New testcase.
PR c++/60065
diff --git a/gcc/testsuite/g++.dg/cpp1y/pr60311.C b/gcc/testsuite/g++.dg/cpp1y/pr60311.C
new file mode 100644
index 0000000..a0db22d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/pr60311.C
@@ -0,0 +1,15 @@
+// PR c++/60311
+// { dg-options -std=c++1y }
+
+template<void(*)(auto)> struct A {}; // { dg-error "auto" }
+
+struct B {
+ template<void(*)(auto)> struct A {}; // { dg-error "auto" }
+};
+
+template <typename T>
+struct C {
+ template<void(*)(auto)> struct A {}; // { dg-error "auto" }
+};
+
+using D = C<int>;