[C++ Patch] PR 85227 ("[7/8/ Regression] ICE with structured binding of a forward declared variable")
Paolo Carlini
paolo.carlini@oracle.com
Fri Apr 6 19:05:00 GMT 2018
Hi,
On 06/04/2018 19:04, Jason Merrill wrote:
> On Fri, Apr 6, 2018 at 5:01 AM, Paolo Carlini <paolo.carlini@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.
/////////////////////
-------------- next part --------------
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>();
+}
More information about the Gcc-patches
mailing list