From eae51472f68d9f922aa3a1a636f81467bfdae87a Mon Sep 17 00:00:00 2001 From: Alexandre Oliva Date: Wed, 29 Nov 2023 04:00:28 -0300 Subject: [PATCH] c++: for contracts, cdtors never return this When targetm.cxx.cdtor_return_this() holds, cdtors have a non-VOID_TYPE_P result, but IMHO this ABI implementation detail shouldn't leak to the abstract language conceptual framework, in which cdtors don't have return values. For contracts, specifically those that establish postconditions on results, such a leakage is present, and the present patch puts an end to it: with it, cdtors get an error for result postconditions regardless of the ABI. This fixes g++.dg/contracts/contracts-ctor-dtor2.C on arm-eabi. for gcc/cp/ChangeLog * contracts.cc (check_postcondition_result): Cope with cdtor_return_this. (cherry picked from commit 71804526d3a71a8c0f189a89ce3aa615784bfd8b) --- gcc/cp/contracts.cc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/gcc/cp/contracts.cc b/gcc/cp/contracts.cc index 9d1cb558f4f7..18482e5c4c85 100644 --- a/gcc/cp/contracts.cc +++ b/gcc/cp/contracts.cc @@ -636,7 +636,11 @@ make_postcondition_variable (cp_expr id) bool check_postcondition_result (tree decl, tree type, location_t loc) { - if (VOID_TYPE_P (type)) + /* Do not be confused by targetm.cxx.cdtor_return_this (); + conceptually, cdtors have no return value. */ + if (VOID_TYPE_P (type) + || DECL_CONSTRUCTOR_P (decl) + || DECL_DESTRUCTOR_P (decl)) { error_at (loc, DECL_CONSTRUCTOR_P (decl) -- 2.47.2