summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2010-01-16 15:23:19 +0000
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2010-01-16 15:23:19 +0000
commitd2b803b8ac1afa0d79d5d60f6d7de0cedfeeb766 (patch)
tree572cb4b5c52eda131d1d51fb619a47e08ed42616
parent011fed15322bb8aca1831bb1a31e5e6f7b4e8624 (diff)
downloadppe42-gcc-d2b803b8ac1afa0d79d5d60f6d7de0cedfeeb766.tar.gz
ppe42-gcc-d2b803b8ac1afa0d79d5d60f6d7de0cedfeeb766.zip
PR c++/42761
* semantics.c (finish_decltype_type): Within a template, treat unresolved CALL_EXPR as dependent. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@155966 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/semantics.c6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/decltype22.C13
4 files changed, 30 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 9f73d86c22e..08307272a00 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2010-01-16 Jason Merrill <jason@redhat.com>
+
+ PR c++/42761
+ * semantics.c (finish_decltype_type): Within a template, treat
+ unresolved CALL_EXPR as dependent.
+
2010-01-15 Dodji Seketeli <dodji@redhat.com>
* error.c (dump_template_parms,count_non_default_template_args):
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index b2f9fd31f56..fa3ecda205d 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -4803,6 +4803,7 @@ finish_decltype_type (tree expr, bool id_expression_or_member_access_p)
if (type && !type_uses_auto (type))
return type;
+ treat_as_dependent:
type = cxx_make_type (DECLTYPE_TYPE);
DECLTYPE_TYPE_EXPR (type) = expr;
DECLTYPE_TYPE_ID_EXPR_OR_MEMBER_ACCESS_P (type)
@@ -4930,6 +4931,11 @@ finish_decltype_type (tree expr, bool id_expression_or_member_access_p)
&& (TREE_CODE (TREE_TYPE (target_type)) == FUNCTION_TYPE
|| TREE_CODE (TREE_TYPE (target_type)) == METHOD_TYPE))
type = TREE_TYPE (TREE_TYPE (target_type));
+ else if (processing_template_decl)
+ /* Within a template finish_call_expr doesn't resolve
+ CALL_EXPR_FN, so even though this decltype isn't really
+ dependent let's defer resolving it. */
+ goto treat_as_dependent;
else
sorry ("unable to determine the declared type of expression %<%E%>",
expr);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 995ba7989e0..8c45d483af0 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2010-01-15 Jason Merrill <jason@redhat.com>
+
+ PR c++/42761
+ * g++.dg/cpp0x/decltype22.C: New.
+
2010-01-16 Jakub Jelinek <jakub@redhat.com>
PR middle-end/42760
diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype22.C b/gcc/testsuite/g++.dg/cpp0x/decltype22.C
new file mode 100644
index 00000000000..74811cfe701
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/decltype22.C
@@ -0,0 +1,13 @@
+// PR c++/42761
+// { dg-options "-std=c++0x" }
+
+template<typename _Tp> _Tp* fn();
+
+template <class T> struct A
+{
+ template <class U,
+ class S = decltype(fn<T>())>
+ struct B { };
+};
+
+A<int> a;
OpenPOWER on IntegriCloud