From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 48) id A5FFE385C40C; Wed, 6 Oct 2021 02:41:19 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A5FFE385C40C From: "cvs-commit at gcc dot gnu.org" To: gcc-bugs@gcc.gnu.org Subject: [Bug c++/102490] Erroneous optimization of default constexpr operator== of struct with bitfields Date: Wed, 06 Oct 2021 02:41:19 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: changed X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: gcc X-Bugzilla-Component: c++ X-Bugzilla-Version: 10.1.0 X-Bugzilla-Keywords: ice-checking, ice-on-valid-code, wrong-code X-Bugzilla-Severity: normal X-Bugzilla-Who: cvs-commit at gcc dot gnu.org X-Bugzilla-Status: ASSIGNED X-Bugzilla-Resolution: X-Bugzilla-Priority: P3 X-Bugzilla-Assigned-To: jason at gcc dot gnu.org X-Bugzilla-Target-Milestone: --- X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: Message-ID: In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: http://gcc.gnu.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-BeenThere: gcc-bugs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-bugs mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 06 Oct 2021 02:41:19 -0000 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=3D102490 --- Comment #6 from CVS Commits --- The master branch has been updated by Jason Merrill : https://gcc.gnu.org/g:09d886e671f2230acca082e6579a69b8df8fb202 commit r12-4202-g09d886e671f2230acca082e6579a69b8df8fb202 Author: Jakub Jelinek Date: Fri Oct 1 17:07:17 2021 +0200 c++: defaulted <=3D> with bitfields [PR102490] The testcases in the patch are either miscompiled or ICE with checking, because the defaulted operator=3D=3D is synthesized too early (but only= if constexpr), when the corresponding class type is still incomplete type.= =20 The problem is that at that point the bitfield FIELD_DECLs still have as TREE_TYPE their underlying type rather than integral type with their precision and when layout_class_type is called for the class soon after that, it changes those types but the COMPONENT_REFs type stay the way t= hat they were during the operator=3D=3D synthesize_method type and the midd= le-end is then upset by the mismatch of types. As what exact type will be given isn't just a one liner but quite long code especially for over-sized bitfield= s, I think it is best to just not synthesize the comparison operators so ear= ly and call defaulted_late_check for them once again as soon as the class = is complete. This is also a problem for virtual operator<=3D>, where we need to comp= are the noexcept-specifier to validate the override before the class is complet= e. Rather than try to defer that comparison, maybe_instantiate_noexcept now calls maybe_synthesize_method, which calls build_comparison_op in non-defining mode if the class isn't complete yet. In that situation we also might not have base fields yet, so we look in the binfo for the ba= ses. Co-authored-by: Jason Merrill 2021-10-01 Jakub Jelinek PR c++/98712 PR c++/102490 * cp-tree.h (maybe_synthesize_method): Declare. * method.c (genericize_spaceship): Use LOOKUP_NORMAL | LOOKUP_NONVIRTUAL | LOOKUP_DEFAULTED instead of LOOKUP_NORMAL for flags. (comp_info): Remove defining member. Add complain, code, retca= t. (comp_info::comp_info): Adjust. (do_one_comp): Split out from build_comparison_op. Use LOOKUP_NORMAL | LOOKUP_NONVIRTUAL | LOOKUP_DEFAULTED instead of LOOKUP_NORMAL for flags. (build_comparison_op): Add defining argument. Adjust comp_info construction. Use defining instead of info.defining. Assert t= hat if defining, ctype is a complete type. Walk base binfos. (synthesize_method, maybe_explain_implicit_delete, explain_implicit_non_constexpr): Adjust build_comparison_op callers. (maybe_synthesize_method): New function. * class.c (check_bases_and_members): Don't call defaulted_late_check for sfk_comparison. (finish_struct_1): Call it here instead after class has been completed. * pt.c (maybe_instantiate_noexcept): Call maybe_synthesize_meth= od instead of synthesize_method. * g++.dg/cpp2a/spaceship-synth8.C (std::strong_ordering): Provi= de more complete definition. (std::strong_ordering::less, std::strong_ordering::equal, std::strong_ordering::greater): Define. * g++.dg/cpp2a/spaceship-synth12.C: New test. * g++.dg/cpp2a/spaceship-synth13.C: New test. * g++.dg/cpp2a/spaceship-synth14.C: New test. * g++.dg/cpp2a/spaceship-eq11.C: New test. * g++.dg/cpp2a/spaceship-eq12.C: New test. * g++.dg/cpp2a/spaceship-eq13.C: New test.=