aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2018-05-22 23:52:49 -0400
committerJason Merrill <jason@gcc.gnu.org>2018-05-22 23:52:49 -0400
commit0d2e69cb3c08f44a15415fb264bf438bb8c9707c (patch)
tree9dce8d90a44b1df615ee30d9750592be1b9d35bb /gcc
parent720820185fc3f63792b2e1d0ed9482768ee64c76 (diff)
downloadgcc-0d2e69cb3c08f44a15415fb264bf438bb8c9707c.zip
gcc-0d2e69cb3c08f44a15415fb264bf438bb8c9707c.tar.gz
gcc-0d2e69cb3c08f44a15415fb264bf438bb8c9707c.tar.bz2
PR c++/85866 - error with .* in default template arg.
* pt.c (tsubst_copy_and_build): Handle partial instantiation. From-SVN: r260562
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/pt.c4
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/fntmpdefarg9.C29
3 files changed, 37 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 6aed157..ce22731 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 81de633..0b04770 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -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
index 0000000..833049c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg9.C
@@ -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)>();
+}