re PR c++/67130 (ICE: tree check: expected identifier_node, have template_decl in write_unqualified_id, at cp/mangle.c:1218)

PR c++/67130
	PR c++/67131
	PR c++/66260
	* mangle.c (write_expression) [TEMPLATE_ID_EXPR]: Handle variable
	templates.
	* pt.c (tsubst_copy_and_build): Check for argument substitution
	failure.

From-SVN: r226676
This commit is contained in:
Jason Merrill 2015-08-06 10:26:18 -04:00 committed by Jason Merrill
parent 47486460a9
commit c1153c1987
5 changed files with 67 additions and 1 deletions

View File

@ -1,3 +1,13 @@
2015-08-06 Jason Merrill <jason@redhat.com>
PR c++/67130
PR c++/67131
PR c++/66260
* mangle.c (write_expression) [TEMPLATE_ID_EXPR]: Handle variable
templates.
* pt.c (tsubst_copy_and_build): Check for argument substitution
failure.
2015-08-05 Jason Merrill <jason@redhat.com>
* pt.c (determine_specialization): Print candidates after 'no

View File

@ -2822,7 +2822,9 @@ write_expression (tree expr)
{
tree fn = TREE_OPERAND (expr, 0);
if (is_overloaded_fn (fn))
fn = DECL_NAME (get_first_fn (fn));
fn = get_first_fn (fn);
if (DECL_P (fn))
fn = DECL_NAME (fn);
if (IDENTIFIER_OPNAME_P (fn))
write_string ("on");
write_unqualified_id (fn);

View File

@ -14752,6 +14752,8 @@ tsubst_copy_and_build (tree t,
if (targs)
targs = tsubst_template_args (targs, args, complain, in_decl);
if (targs == error_mark_node)
return error_mark_node;
if (variable_template_p (templ))
{

View File

@ -0,0 +1,17 @@
// PR c++/67131
// { dg-do compile { target c++14 } }
template <typename T> typename T::_ type;
template <template <typename...> class> struct A;
template <template <typename> class f> A<f> metafunction;
namespace detail {
template <typename> struct _decltype;
}
template <template <typename...> class F> struct A {
template <typename... T>
auto operator()() -> decltype(type<F<detail::_decltype<T>...>>);
};
template <typename F> auto valid_call(F f) -> decltype(f());
constexpr auto valid_call(...) { return 0; }
template <typename> struct no_type;
static_assert(!valid_call(metafunction<no_type>),""); // { dg-error "" }

View File

@ -0,0 +1,35 @@
// PR c++/67130
// { dg-do compile { target c++14 } }
namespace std {
template <typename> struct __success_type;
template <typename> void declval();
template <typename> class decay {
public:
typedef int type;
};
template <typename...> struct common_type;
struct A {
template <typename, typename _Up>
static __success_type<typename decay<decltype(declval<_Up>)>::type> _S_test;
};
template <typename _Tp, typename _Up> struct __common_type_impl : A {
typedef decltype(_S_test<_Tp, _Up>) type;
};
template <typename _Tp, typename _Up>
struct common_type<_Tp, _Up> : __common_type_impl<_Tp, _Up> {};
}
template <typename> struct B { struct _; };
template <typename T> typename B<T>::_ type;
template <template <typename...> class> struct C;
template <template <typename...> class f> C<f> metafunction;
template <typename T> struct B<T>::_ {};
namespace detail {
template <typename> struct _decltype;
}
template <template <typename...> class F> struct C {
template <typename... T>
auto operator()(T...)
-> decltype(type<typename F<detail::_decltype<T>...>::type>);
};
auto common_type = metafunction<std::common_type>(0, 0);