aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2007-11-29 22:04:04 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2007-11-29 22:04:04 +0100
commit7a547b936c01964cfcc9543db0d86c008f7269da (patch)
tree6d76a7a037f9bac1f6c110f41cfb1978b264a6a1 /gcc
parent10650fbb88871139f242597b1f081041868c43f6 (diff)
downloadgcc-7a547b936c01964cfcc9543db0d86c008f7269da.zip
gcc-7a547b936c01964cfcc9543db0d86c008f7269da.tar.gz
gcc-7a547b936c01964cfcc9543db0d86c008f7269da.tar.bz2
re PR c++/34267 (ICE applying __decltype to name of template class)
PR c++/34267 PR c++/34268 * parser.c (cp_parser_decltype): Don't call finish_id_expression on ~type. * semantics.c (finish_decltype_type): Issue error on types, TYPE_DECLs and ~type early. * g++.dg/cpp0x/decltype7.C: New test. * g++.dg/cpp0x/decltype8.C: New test. From-SVN: r130519
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog9
-rw-r--r--gcc/cp/parser.c4
-rw-r--r--gcc/cp/semantics.c9
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/decltype7.C14
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/decltype8.C12
6 files changed, 54 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index ea87688..3f7f9dc 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,12 @@
+2007-11-29 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/34267
+ PR c++/34268
+ * parser.c (cp_parser_decltype): Don't call finish_id_expression
+ on ~type.
+ * semantics.c (finish_decltype_type): Issue error on types, TYPE_DECLs
+ and ~type early.
+
2007-11-27 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/34181
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 8e16d22..7b173f0 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -8512,10 +8512,12 @@ cp_parser_decltype (cp_parser *parser)
/*check_dependency=*/true,
/*ambiguous_decls=*/NULL);
- if (expr
+ if (expr
&& expr != error_mark_node
&& TREE_CODE (expr) != TEMPLATE_ID_EXPR
&& TREE_CODE (expr) != TYPE_DECL
+ && (TREE_CODE (expr) != BIT_NOT_EXPR
+ || !TYPE_P (TREE_OPERAND (expr, 0)))
&& cp_lexer_peek_token (parser->lexer)->type == CPP_CLOSE_PAREN)
{
/* Complete lookup of the id-expression. */
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index 1ae7d0f..381774e 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -4066,6 +4066,15 @@ finish_decltype_type (tree expr, bool id_expression_or_member_access_p)
if (!expr || error_operand_p (expr))
return error_mark_node;
+ if (TYPE_P (expr)
+ || TREE_CODE (expr) == TYPE_DECL
+ || (TREE_CODE (expr) == BIT_NOT_EXPR
+ && TYPE_P (TREE_OPERAND (expr, 0))))
+ {
+ error ("argument to decltype must be an expression");
+ return error_mark_node;
+ }
+
if (type_dependent_expression_p (expr))
{
type = make_aggr_type (DECLTYPE_TYPE);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 889d220..c04a77f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2007-11-29 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/34267
+ PR c++/34268
+ * g++.dg/cpp0x/decltype7.C: New test.
+ * g++.dg/cpp0x/decltype8.C: New test.
+
2007-11-29 Tobias Burnus <burnus@net-b.de>
PR fortran/34248
diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype7.C b/gcc/testsuite/g++.dg/cpp0x/decltype7.C
new file mode 100644
index 0000000..f757c9e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/decltype7.C
@@ -0,0 +1,14 @@
+// PR c++/34268
+// { dg-do compile }
+
+struct A
+{
+ __decltype (A); // { dg-error "must be an expression" }
+ __decltype (~A); // { dg-error "must be an expression" }
+};
+
+struct B
+{
+ __typeof__ (B);
+ __typeof__ (~B); // { dg-error "expected primary-expression" }
+};
diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype8.C b/gcc/testsuite/g++.dg/cpp0x/decltype8.C
new file mode 100644
index 0000000..3680689
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/decltype8.C
@@ -0,0 +1,12 @@
+// PR c++/34267
+// { dg-do compile }
+
+struct A {};
+__decltype (A); // { dg-error "must be an expression" }
+template<int> struct B
+{
+ __decltype (A); // { dg-error "must be an expression" }
+ __decltype (~A); // { dg-error "must be an expression" }
+ __decltype (B); // { dg-error "must be an expression" }
+ __decltype (~B); // { dg-error "must be an expression" }
+};