aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2018-03-01 14:40:36 -0500
committerJason Merrill <jason@gcc.gnu.org>2018-03-01 14:40:36 -0500
commiteedaaaf7d7892011245b1e2054ca917c6d81c213 (patch)
treeba7da455b178800799807d8c734af0c0e2bec837
parent90abdde05bf124418f83e061677f5330e15664d9 (diff)
downloadgcc-eedaaaf7d7892011245b1e2054ca917c6d81c213.zip
gcc-eedaaaf7d7892011245b1e2054ca917c6d81c213.tar.gz
gcc-eedaaaf7d7892011245b1e2054ca917c6d81c213.tar.bz2
PR c++/71569 - decltype of template.
* parser.c (cp_parser_decltype_expr): Handle missing template args. From-SVN: r258110
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/parser.c7
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/decltype-33837.C4
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/decltype43.C2
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/var-templ59.C14
5 files changed, 29 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index acaabd0..df5f48c 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2018-03-01 Jason Merrill <jason@redhat.com>
+
+ PR c++/71569 - decltype of template.
+ * parser.c (cp_parser_decltype_expr): Handle missing template args.
+
2018-03-01 Marek Polacek <polacek@redhat.com>
PR c++/84596
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 359460c..e1acb07 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -13983,6 +13983,10 @@ cp_parser_decltype_expr (cp_parser *parser,
expr = cp_parser_lookup_name_simple (parser, expr,
id_expr_start_token->location);
+ if (expr && TREE_CODE (expr) == TEMPLATE_DECL)
+ /* A template without args is not a complete id-expression. */
+ expr = error_mark_node;
+
if (expr
&& expr != error_mark_node
&& TREE_CODE (expr) != TYPE_DECL
@@ -14048,6 +14052,9 @@ cp_parser_decltype_expr (cp_parser *parser,
expression. */
cp_parser_abort_tentative_parse (parser);
+ /* Commit to the tentative_firewall so we get syntax errors. */
+ cp_parser_commit_to_tentative_parse (parser);
+
/* Parse a full expression. */
expr = cp_parser_expression (parser, /*pidk=*/NULL, /*cast_p=*/false,
/*decltype_p=*/true);
diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype-33837.C b/gcc/testsuite/g++.dg/cpp0x/decltype-33837.C
index fbbc6a1..4a8f053 100644
--- a/gcc/testsuite/g++.dg/cpp0x/decltype-33837.C
+++ b/gcc/testsuite/g++.dg/cpp0x/decltype-33837.C
@@ -2,6 +2,6 @@
// PR c++/33837
void foo()
{
- __decltype (A::foo()); // { dg-error "was not declared|expected" }
- __decltype (B); // { dg-error "was not declared" }
+ __decltype (A::foo()); // { dg-error "A" }
+ __decltype (B); // { dg-error "B" }
}
diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype43.C b/gcc/testsuite/g++.dg/cpp0x/decltype43.C
index 4df95a1..7a1dcbf 100644
--- a/gcc/testsuite/g++.dg/cpp0x/decltype43.C
+++ b/gcc/testsuite/g++.dg/cpp0x/decltype43.C
@@ -22,6 +22,6 @@ struct B
int main()
{
int x = B<decltype(A<int>::a(1))>::b(A<int>::a(1));
- int y = B<decltype(A ::a(2))>::b(A<int>::a(2)); // { dg-error "template argument" }
+ int y = B<decltype(A ::a(2))>::b(A<int>::a(2)); // { dg-error "template" }
return x + y;
}
diff --git a/gcc/testsuite/g++.dg/cpp1y/var-templ59.C b/gcc/testsuite/g++.dg/cpp1y/var-templ59.C
new file mode 100644
index 0000000..da9710e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/var-templ59.C
@@ -0,0 +1,14 @@
+// PR c++/71569
+// { dg-do compile { target c++14 } }
+
+template <class T>
+struct A {
+ template <class U>
+ static U u;
+};
+
+int main()
+{
+ decltype(A<int>::u) a; // { dg-error "missing template arguments" }
+ return a;
+}