P0490R0 GB 20: decomposition declaration should commit to tuple interpretation early
authorJakub Jelinek <jakub@redhat.com>
Thu, 15 Dec 2016 20:42:11 +0000 (21:42 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 15 Dec 2016 20:42:11 +0000 (21:42 +0100)
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.

* g++.dg/cpp1z/decomp10.C (f1): Adjust expected diagnostics.

From-SVN: r243724

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp1z/decomp10.C

index 9c6ee489689126bcadecf949d2dd0fdaed296a0b..5c6713234a8e1c08cdfad418d8087001fa7a585e 100644 (file)
@@ -1,3 +1,15 @@
+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
index d7dbf94c07699378d0ca3b85391d3da42dfbd130..e83b542d424d698414f2835d771676a4dd42d0a4 100644 (file)
@@ -7259,7 +7259,7 @@ find_decomp_class_base (location_t loc, tree type, tree ret)
 
 /* Return std::tuple_size<TYPE>::value.  */
 
-tree
+static tree
 get_tuple_size (tree type)
 {
   tree args = make_tree_vec (1);
@@ -7268,6 +7268,9 @@ get_tuple_size (tree type)
                                     /*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)
@@ -7275,12 +7278,12 @@ get_tuple_size (tree type)
   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);
@@ -7297,7 +7300,7 @@ get_tuple_element_type (tree type, unsigned i)
 
 /* 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");
@@ -7342,6 +7345,7 @@ store_decomp_type (tree v, tree t)
     decomp_type_table = hash_map<tree,tree>::create_ggc (13);
   decomp_type_table->put (v, t);
 }
+
 tree
 lookup_decomp_type (tree v)
 {
@@ -7502,6 +7506,12 @@ cp_finish_decomp (tree decl, tree first, unsigned int count)
     }
   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;
index ac49d4d71c031662db2e92a9de8d2cc6d3be89d7..ea45738e265fb754b252e6da262f926cd479146b 100644 (file)
@@ -1,3 +1,9 @@
+2016-12-15  Jakub Jelinek  <jakub@redhat.com>
+
+       P0490R0 GB 20: decomposition declaration should commit to tuple
+       interpretation early
+       * g++.dg/cpp1z/decomp10.C (f1): Adjust expected diagnostics.
+
 2016-12-15  Nathan Sidwell  <nathan@acm.org>
 
        PR c++/77585
index 2abbaaebe9a7ec4cdb6909ce0523ba59d0a81c5b..c2bcb93c1d71eb418226d85d85d9fa2f91767c46 100644 (file)
@@ -7,7 +7,7 @@ namespace std {
 
 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 }; };