aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2009-12-04 17:51:12 -0500
committerJason Merrill <jason@gcc.gnu.org>2009-12-04 17:51:12 -0500
commit21920fd14c2f98c8ecd0ce70eaa369793276c555 (patch)
tree8b367fd140436e6ad185482b528e43ae5bcc6d46
parent2f2d73866bd4fd1e441234808ef3e98d8ae54b94 (diff)
downloadgcc-21920fd14c2f98c8ecd0ce70eaa369793276c555.zip
gcc-21920fd14c2f98c8ecd0ce70eaa369793276c555.tar.gz
gcc-21920fd14c2f98c8ecd0ce70eaa369793276c555.tar.bz2
re PR c++/42277 (decltype error in template)
PR c++/42277 * semantics.c (finish_decltype_type): Don't assume that op1 of a COMPONENT_REF is always the field. * g++.dg/cpp0x/decltype20.C: New. From-SVN: r155002
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/semantics.c8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/decltype20.C10
4 files changed, 28 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 0c96a78..7ec27d4 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2009-12-04 Jason Merrill <jason@redhat.com>
+
+ PR c++/42277
+ * semantics.c (finish_decltype_type): Defer handling of decltype
+ of a non-dependent COMPONENT_REF in a template.
+
2009-12-04 Dodji Seketeli <dodji@redhat.com>
PR c++/42218
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index 4c36280..841efc8 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -4777,7 +4777,13 @@ finish_decltype_type (tree expr, bool id_expression_or_member_access_p)
return error_mark_node;
}
- if (type_dependent_expression_p (expr))
+ if (type_dependent_expression_p (expr)
+ /* In a template, a COMPONENT_REF has an IDENTIFIER_NODE for op1 even
+ if it isn't dependent, so that we can check access control at
+ instantiation time, so defer the decltype as well (PR 42277). */
+ || (id_expression_or_member_access_p
+ && processing_template_decl
+ && TREE_CODE (expr) == COMPONENT_REF))
{
if (id_expression_or_member_access_p)
{
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index b20ddd2..ed866cf 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2009-12-04 Jason Merrill <jason@redhat.com>
+
+ PR c++/42277
+ * g++.dg/cpp0x/decltype20.C: New.
+
2009-12-04 David Daney <ddaney@caviumnetworks.com>
PR rtl-optimization/42164
diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype20.C b/gcc/testsuite/g++.dg/cpp0x/decltype20.C
new file mode 100644
index 0000000..3155cdc
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/decltype20.C
@@ -0,0 +1,10 @@
+// PR c++/42277
+// { dg-options -std=c++0x }
+
+struct S { int s; };
+template <int N>
+void foo ()
+{
+ S s;
+ decltype (s.s) i;
+}