re PR c++/48319 ([C++0x] Segmentation fault in instantiation of std::is_constructible<int>)

PR c++/48319
	* pt.c (value_dependent_expression_p): Handle TEMPLATE_ID_EXPR.

From-SVN: r171689
This commit is contained in:
Jason Merrill 2011-03-29 14:47:56 -04:00 committed by Jason Merrill
parent 00a0d6f359
commit 5b9e705e63
4 changed files with 35 additions and 0 deletions

View 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.

View 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. */

View 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.

View File

@ -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;
}