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>();
+}