PR c++/85866 - error with .* in default template arg.
authorJason Merrill <jason@redhat.com>
Wed, 23 May 2018 03:52:49 +0000 (23:52 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 23 May 2018 03:52:49 +0000 (23:52 -0400)
* pt.c (tsubst_copy_and_build): Handle partial instantiation.

From-SVN: r260562

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

index 6aed157616b6aba7583937660c8fc2416584e007..ce22731d63c305e173e2f39513525263b097b1af 100644 (file)
@@ -1,3 +1,8 @@
+2018-05-22  Jason Merrill  <jason@redhat.com>
+
+       PR c++/85866 - error with .* in default template arg.
+       * pt.c (tsubst_copy_and_build): Handle partial instantiation.
+
 2018-05-21  Paolo Carlini  <paolo.carlini@oracle.com>
 
        * parser.c (cp_parser_parameter_declaration_list): Remove
index 81de633b1eeba4e263397c4dea777cf96e46f44b..0b04770e123d1a9c604b042e7d57f69bccf62db0 100644 (file)
@@ -18433,7 +18433,9 @@ tsubst_copy_and_build (tree t,
              /* Unsupported internal function with arguments.  */
              gcc_unreachable ();
            }
-       else if (TREE_CODE (function) == OFFSET_REF)
+       else if (TREE_CODE (function) == OFFSET_REF
+                || TREE_CODE (function) == DOTSTAR_EXPR
+                || TREE_CODE (function) == MEMBER_REF)
          ret = build_offset_ref_call_from_tree (function, &call_args,
                                                 complain);
        else if (TREE_CODE (function) == COMPONENT_REF)
diff --git a/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg9.C b/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg9.C
new file mode 100644 (file)
index 0000000..833049c
--- /dev/null
@@ -0,0 +1,29 @@
+// PR c++/85866
+// { dg-do compile { target c++11 } }
+
+template<typename _Tp, typename _Up = _Tp&&>
+_Up
+__declval(int);
+
+template<typename _Tp>
+_Tp
+__declval(long);
+
+template<typename _Tp>
+auto declval() noexcept -> decltype(__declval<_Tp>(0));
+
+template<typename...>
+using void_t = void;
+
+template<typename U, typename V,
+        void_t<decltype ( (declval<U>().*declval<V>()) () )
+               >* = nullptr>
+void boom(){}
+
+struct Foo {
+  void bar(){}
+};
+
+int main() {
+  boom<Foo, decltype(&Foo::bar)>();
+}