aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAdam Butcher <adam@jessamine.co.uk>2014-02-21 07:47:55 +0000
committerAdam Butcher <abutcher@gcc.gnu.org>2014-02-21 07:47:55 +0000
commit2807d5d23841ba8e07591274fb82867274bd3fbe (patch)
tree60d53f80a20ab90add4fcf4cdf2b8396b7bc5df3 /gcc
parent76a4b7ad2d7d071458a4cb4d8515c14b9abf0d19 (diff)
downloadgcc-2807d5d23841ba8e07591274fb82867274bd3fbe.zip
gcc-2807d5d23841ba8e07591274fb82867274bd3fbe.tar.gz
gcc-2807d5d23841ba8e07591274fb82867274bd3fbe.tar.bz2
Fix PR c++/60052 and PR c++/60053.
PR c++/60052 PR c++/60053 * parser.c (cp_parser_parameter_declaration_list): Correctly reset implicit_template_scope upon leaving an out-of-line generic member function definition. PR c++/60052 PR c++/60053 * g++.dg/cpp1y/pr60052.C: New testcase. * g++.dg/cpp1y/pr60053.C: New testcase. From-SVN: r207980
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog8
-rw-r--r--gcc/cp/parser.c16
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/pr60052.C15
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/pr60053.C15
5 files changed, 58 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 602ab94..7d4af6d 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,11 @@
+2014-02-21 Adam Butcher <adam@jessamine.co.uk>
+
+ PR c++/60052
+ PR c++/60053
+ * parser.c (cp_parser_parameter_declaration_list): Correctly reset
+ implicit_template_scope upon leaving an out-of-line generic member
+ function definition.
+
2014-02-20 Kai Tietz <ktietz@redhat.com>
PR c++/58873
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 4673f78..1e4e3df 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -18372,11 +18372,21 @@ cp_parser_parameter_declaration_list (cp_parser* parser, bool *is_error)
parser->in_unbraced_linkage_specification_p
= saved_in_unbraced_linkage_specification_p;
+ /* Reset implicit_template_scope if we are about to leave the function
+ parameter list that introduced it. Note that for out-of-line member
+ definitions, there will be one or more class scopes before we get to
+ the template parameter scope. */
+
if (cp_binding_level *its = parser->implicit_template_scope)
- if (current_binding_level->level_chain == its)
+ if (cp_binding_level *maybe_its = current_binding_level->level_chain)
{
- parser->implicit_template_parms = 0;
- parser->implicit_template_scope = 0;
+ while (maybe_its->kind == sk_class)
+ maybe_its = maybe_its->level_chain;
+ if (maybe_its == its)
+ {
+ parser->implicit_template_parms = 0;
+ parser->implicit_template_scope = 0;
+ }
}
return parameters;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ec294e7..df82431 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2014-02-21 Adam Butcher <adam@jessamine.co.uk>
+
+ PR c++/60052
+ PR c++/60053
+ * g++.dg/cpp1y/pr60052.C: New testcase.
+ * g++.dg/cpp1y/pr60053.C: New testcase.
+
2014-02-21 Tobias Burnus <burnus@net-b.de>
PR fortran/60286
diff --git a/gcc/testsuite/g++.dg/cpp1y/pr60052.C b/gcc/testsuite/g++.dg/cpp1y/pr60052.C
new file mode 100644
index 0000000..191e5ac
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/pr60052.C
@@ -0,0 +1,15 @@
+// PR c++/60052
+// { dg-do compile }
+// { dg-options "-std=c++1y" }
+
+struct A
+{
+ void foo(auto);
+};
+
+void A::foo(auto) {}
+
+struct B
+{
+ void bar(auto);
+};
diff --git a/gcc/testsuite/g++.dg/cpp1y/pr60053.C b/gcc/testsuite/g++.dg/cpp1y/pr60053.C
new file mode 100644
index 0000000..345a9b8
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/pr60053.C
@@ -0,0 +1,15 @@
+// PR c++/60053
+// { dg-do compile }
+// { dg-options "-std=c++1y" }
+
+struct A
+{
+ void foo(auto);
+};
+
+void A::foo(auto) {}
+
+template<typename> struct B
+{
+ template<typename T> void bar(auto);
+};