aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAdam Butcher <adam@jessamine.co.uk>2014-02-18 22:29:56 +0000
committerAdam Butcher <abutcher@gcc.gnu.org>2014-02-18 22:29:56 +0000
commit75e9d9a0fadca1fb57f3f28357ac5d0c2ee54e58 (patch)
tree372fac2018bea49dc5ac1e04d420662896e0bd99 /gcc
parent4ea4bf9c33f47bc573d31e86ce353cbcc0c37f05 (diff)
downloadgcc-75e9d9a0fadca1fb57f3f28357ac5d0c2ee54e58.zip
gcc-75e9d9a0fadca1fb57f3f28357ac5d0c2ee54e58.tar.gz
gcc-75e9d9a0fadca1fb57f3f28357ac5d0c2ee54e58.tar.bz2
re PR c++/60064 ([c++1y] ICE with auto as parameter of friend function)
Fix PR c++/60064. PR c++/60064 * parser.c (cp_parser_member_declaration): Pop fully implicit template scope for generic friend declarations as well as for non-friends. PR c++/60064 * g++.dg/cpp1y/pr60064.C: New testcase. From-SVN: r207856
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/parser.c8
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/pr60064.C21
4 files changed, 31 insertions, 5 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index b0fd4b7..e29e9dd 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -5,6 +5,10 @@
scope whenever a template parameter list has been started, independent
of whether the function call operator was well-formed or not.
+ PR c++/60064
+ * parser.c (cp_parser_member_declaration): Pop fully implicit template
+ scope for generic friend declarations as well as for non-friends.
+
2014-02-12 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/60047
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 23d54fb..9818213 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -20406,13 +20406,11 @@ cp_parser_member_declaration (cp_parser* parser)
&decl_specifiers,
declarator,
attributes);
+ if (parser->fully_implicit_function_template_p)
+ decl = finish_fully_implicit_template (parser, decl);
/* If the member was not a friend, declare it here. */
if (!friend_p)
- {
- if (parser->fully_implicit_function_template_p)
- decl = finish_fully_implicit_template (parser, decl);
- finish_member_declaration (decl);
- }
+ finish_member_declaration (decl);
/* Peek at the next token. */
token = cp_lexer_peek_token (parser->lexer);
/* If the next token is a semicolon, consume it. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 780614c..855b0c2 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -9,6 +9,9 @@
PR c++/60190
* g++.dg/cpp1y/pr60190.C: New testcase.
+ PR c++/60064
+ * g++.dg/cpp1y/pr60064.C: New testcase.
+
2014-02-18 Uros Bizjak <ubizjak@gmail.com>
PR target/60205
diff --git a/gcc/testsuite/g++.dg/cpp1y/pr60064.C b/gcc/testsuite/g++.dg/cpp1y/pr60064.C
new file mode 100644
index 0000000..21b043d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/pr60064.C
@@ -0,0 +1,21 @@
+// PR c++/60064
+// { dg-do compile }
+// { dg-options "-std=c++1y" }
+
+class A
+{
+ int m;
+ friend void foo (auto) {}
+ friend void foo2 (auto);
+};
+
+void foo2 (auto i)
+{
+ A a;
+ a.m = i;
+}
+
+int main ()
+{
+ foo2 (7);
+}