PR c++/50870
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 7 Nov 2011 22:52:23 +0000 (22:52 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 7 Nov 2011 22:52:23 +0000 (22:52 +0000)
* pt.c (tsubst_copy): Handle NAMESPACE_DECL.
(tsubst_copy_and_build) [COMPONENT_REF]: Handle a still-dependent
object.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@181131 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/decltype35.C [new file with mode: 0644]

index f75fcc2..4945fd9 100644 (file)
@@ -1,3 +1,10 @@
+2011-11-07  Jason Merrill  <jason@redhat.com>
+
+       PR c++/50870
+       * pt.c (tsubst_copy): Handle NAMESPACE_DECL.
+       (tsubst_copy_and_build) [COMPONENT_REF]: Handle a still-dependent
+       object.
+
 2011-11-07  Paolo Carlini  <paolo.carlini@oracle.com>
 
        * pt.c (tsubst_copy_and_build): Fix qualified_name_lookup_error
index c4f4a94..53a5358 100644 (file)
@@ -12010,6 +12010,9 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl)
       mark_used (t);
       return t;
 
+    case NAMESPACE_DECL:
+      return t;
+
     case OVERLOAD:
       /* An OVERLOAD will always be a non-dependent overload set; an
         overload set from function scope will just be represented with an
@@ -13871,7 +13874,9 @@ tsubst_copy_and_build (tree t,
        if (member == error_mark_node)
          return error_mark_node;
 
-       if (object_type && !CLASS_TYPE_P (object_type))
+       if (type_dependent_expression_p (object))
+         /* We can't do much here.  */;
+       else if (!CLASS_TYPE_P (object_type))
          {
            if (SCALAR_TYPE_P (object_type))
              {
index 1560c27..e2eccc5 100644 (file)
@@ -1,3 +1,8 @@
+2011-11-07  Jason Merrill  <jason@redhat.com>
+
+       PR c++/50870
+       * g++.dg/cpp0x/decltype35.C: New.
+
 2011-11-07  Dodji Seketeli  <dodji@redhat.com>
 
        Support C++11 alias-declaration
diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype35.C b/gcc/testsuite/g++.dg/cpp0x/decltype35.C
new file mode 100644 (file)
index 0000000..d1fd476
--- /dev/null
@@ -0,0 +1,15 @@
+// PR c++/50870
+// { dg-options -std=c++0x }
+
+template <class V>
+  struct impl
+  {
+    template <class T> static T create();
+  };
+
+template <class T, class U, class V, class
+      = decltype(impl<V>::template create<T>()
+             -> impl<V>::template create<U>())>
+struct tester { };
+
+tester<impl<float>*, int, float> ti;