Hi,

On 06/04/2018 19:04, Jason Merrill wrote:
On Fri, Apr 6, 2018 at 5:01 AM, Paolo Carlini <paolo.carl...@oracle.com> wrote:
here, for an incomplete type we ICE pretty soon in find_decomp_class_base.
Comparing to other cases too, I convinced myself that trying to complete the
type is Ok. Also, it seems that in these functions we want to talk about
structured binding and use an appropriate location, thus no
complete_type_or_maybe_complain. Tested x86_64-linux.
What if, in a template, we defer trying to do bindings to an incomplete type, so

extern struct A a;

template<int>
void f()
{
   auto [x] = a;
}

struct A { int i; };

int main()
{
   f<0>();
}

works?  Probably with a pedwarn, as in xref_basetypes or
cp_parser_dot_deref_incomplete.
Ok... I tested the very simple patch below, wasnt sure between pedwarn (loc, 0, ...) and pedwarn (loc, OPT_Wpedantic, ...) but probably we want to former in order not to be too permissive (for comparison, clang rejects with an hard error both tests). What do you think?

Thanks!
Paolo.

/////////////////////
Index: cp/decl.c
===================================================================
--- cp/decl.c   (revision 259184)
+++ cp/decl.c   (working copy)
@@ -7756,6 +7756,9 @@ cp_finish_decomp (tree decl, tree first, unsigned
       error_at (loc, "cannot decompose lambda closure type %qT", type);
       goto error_out;
     }
+  else if (processing_template_decl && !COMPLETE_TYPE_P (type))
+    pedwarn (loc, 0, "structured binding refers to incomplete class type %qT",
+            type);
   else
     {
       tree btype = find_decomp_class_base (loc, type, NULL_TREE);
Index: testsuite/g++.dg/cpp1z/decomp43.C
===================================================================
--- testsuite/g++.dg/cpp1z/decomp43.C   (nonexistent)
+++ testsuite/g++.dg/cpp1z/decomp43.C   (working copy)
@@ -0,0 +1,10 @@
+// PR c++/85227
+// { dg-do compile { target c++11 } }
+// { dg-options "" }
+
+extern struct A a;
+
+template<int> void foo()
+{
+  auto[i] = a;  // { dg-warning "incomplete" }
+}  // { dg-warning "structured bindings only available with -std=c..17 or 
-std=gnu..17" "" { target c++14_down } .-1 }
Index: testsuite/g++.dg/cpp1z/decomp44.C
===================================================================
--- testsuite/g++.dg/cpp1z/decomp44.C   (nonexistent)
+++ testsuite/g++.dg/cpp1z/decomp44.C   (working copy)
@@ -0,0 +1,18 @@
+// PR c++/85227
+// { dg-do compile { target c++11 } }
+// { dg-options "" }
+
+extern struct A a;
+
+template<int>
+void f()
+{
+  auto [x] = a;  // { dg-warning "incomplete" }
+}  // { dg-warning "structured bindings only available with -std=c..17 or 
-std=gnu..17" "" { target c++14_down } .-1 }
+
+struct A { int i; };
+
+int main()
+{
+  f<0>();
+}

Reply via email to