+2016-12-15 Jakub Jelinek <jakub@redhat.com>
+
+ P0490R0 GB 20: decomposition declaration should commit to tuple
+ interpretation early
+ * decl.c (get_tuple_size): Make static. If inst is error_mark_node
+ or non-complete type, return NULL_TREE, otherwise if
+ lookup_qualified_name fails or doesn't fold into INTEGER_CST, return
+ error_mark_node.
+ (get_tuple_element_type, get_tuple_decomp_init): Make static.
+ (cp_finish_decomp): Pass LOC to get_tuple_size. If it returns
+ error_mark_node, complain and fail.
+
2016-12-15 Nathan Sidwell <nathan@acm.org>
PR c++/77585
/* Return std::tuple_size<TYPE>::value. */
-tree
+static tree
get_tuple_size (tree type)
{
tree args = make_tree_vec (1);
/*in_decl*/NULL_TREE,
/*context*/std_node,
/*entering_scope*/false, tf_none);
+ inst = complete_type (inst);
+ if (inst == error_mark_node || !COMPLETE_TYPE_P (inst))
+ return NULL_TREE;
tree val = lookup_qualified_name (inst, get_identifier ("value"),
/*type*/false, /*complain*/false);
if (TREE_CODE (val) == VAR_DECL || TREE_CODE (val) == CONST_DECL)
if (TREE_CODE (val) == INTEGER_CST)
return val;
else
- return NULL_TREE;
+ return error_mark_node;
}
/* Return std::tuple_element<I,TYPE>::type. */
-tree
+static tree
get_tuple_element_type (tree type, unsigned i)
{
tree args = make_tree_vec (2);
/* Return e.get<i>() or get<i>(e). */
-tree
+static tree
get_tuple_decomp_init (tree decl, unsigned i)
{
tree get_id = get_identifier ("get");
decomp_type_table = hash_map<tree,tree>::create_ggc (13);
decomp_type_table->put (v, t);
}
+
tree
lookup_decomp_type (tree v)
{
}
else if (tree tsize = get_tuple_size (type))
{
+ if (tsize == error_mark_node)
+ {
+ error_at (loc, "%<std::tuple_size<%T>::value%> is not an integral "
+ "constant expression", type);
+ goto error_out;
+ }
eltscnt = tree_to_uhwi (tsize);
if (count != eltscnt)
goto cnt_mismatch;
struct A1 { int i,j; } a1;
template<> struct std::tuple_size<A1> { };
-void f1() { auto [ x ] = a1; } // { dg-error "decomposes into 2" }
+void f1() { auto [ x ] = a1; } // { dg-error "is not an integral constant expression" }
struct A2 { int i,j; } a2;
template<> struct std::tuple_size<A2> { enum { value = 5 }; };