re PR c++/48319 ([C++0x] Segmentation fault in instantiation of std::is_constructible...
authorJason Merrill <jason@redhat.com>
Tue, 29 Mar 2011 18:47:56 +0000 (14:47 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 29 Mar 2011 18:47:56 +0000 (14:47 -0400)
PR c++/48319
* pt.c (value_dependent_expression_p): Handle TEMPLATE_ID_EXPR.

From-SVN: r171689

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

index 3d0c02a44fa89d6fb1e96b5d9557f11d1736bdcb..c4df48dd746101c03236df5be7aacdb8fea5e5df 100644 (file)
@@ -1,5 +1,8 @@
 2011-03-29  Jason Merrill  <jason@redhat.com>
 
+       PR c++/48319
+       * pt.c (value_dependent_expression_p): Handle TEMPLATE_ID_EXPR.
+
        PR c++/48089
        * semantics.c (potential_constant_expression_1): Change error about
        use of *this in constructor into sorry.
index dfc726a005a3a30c2d4d5767cd2ce6d8525ef840..aa0901be3be8f2e8cc6796e6ecf52a298becbdce 100644 (file)
@@ -18218,6 +18218,11 @@ value_dependent_expression_p (tree expression)
        return false;
       }
 
+    case TEMPLATE_ID_EXPR:
+      /* If a TEMPLATE_ID_EXPR involves a dependent name, it will be
+        type-dependent.  */
+      return type_dependent_expression_p (expression);
+
     default:
       /* A constant expression is value-dependent if any subexpression is
         value-dependent.  */
index fbd21e5d3a41cce685bb4d2ab0c46a0f9c434d3a..95157981e257cf8873788620a7deca24f7fbb671 100644 (file)
@@ -1,5 +1,7 @@
 2011-03-29  Jason Merrill  <jason@redhat.com>
 
+       * g++.dg/cpp0x/dependent1.C: New.
+
        * g++.dg/cpp0x/constexpr-48089.C: Adjust.
 
        * g++.dg/cpp0x/constexpr-memfn1.C: New.
diff --git a/gcc/testsuite/g++.dg/cpp0x/dependent1.C b/gcc/testsuite/g++.dg/cpp0x/dependent1.C
new file mode 100644 (file)
index 0000000..1ceeeaf
--- /dev/null
@@ -0,0 +1,25 @@
+// PR c++/48319
+// { dg-options -std=c++0x }
+// We were failing to recognize declval<_Args1> as dependent.
+
+template<typename Tp> Tp declval() noexcept;
+
+template<typename _Tp>
+class __is_constructible_helper
+{
+  typedef char __one;
+  typedef struct { char __arr[2]; } __two;
+
+  template<typename _Tp1, typename... _Args1>
+  static decltype(_Tp1(declval<_Args1>()...), __one()) __test(int);
+
+  template<typename, typename...>
+  static __two __test(...);
+
+public:
+  static const bool __value = sizeof(__test<_Tp>(0)) == 1;
+};
+
+int main() {
+  return __is_constructible_helper<int>::__value;
+}