public inbox for gcc-cvs@sourceware.org help / color / mirror / Atom feed
From: Iain Buclaw <ibuclaw@gcc.gnu.org> To: gcc-cvs@gcc.gnu.org Subject: [gcc r12-2598] d: Return the correct value for C++ constructor calls (PR101664) Date: Thu, 29 Jul 2021 15:12:59 +0000 (GMT) [thread overview] Message-ID: <20210729151259.80A1439B3C31@sourceware.org> (raw) https://gcc.gnu.org/g:7616ed6307c90b5bbf1bf53550d33cc674ab4b6f commit r12-2598-g7616ed6307c90b5bbf1bf53550d33cc674ab4b6f Author: Iain Buclaw <ibuclaw@gdcproject.org> Date: Mon Jul 26 19:34:33 2021 +0200 d: Return the correct value for C++ constructor calls (PR101664) C++ constructors return void, even though the front-end semantic treats them as implicitly returning `this'. To handle this correctly, the object reference is cached and used as the result of the expression. PR d/101664 gcc/d/ChangeLog: * expr.cc (ExprVisitor::visit (CallExp *)): Use object expression as result for C++ constructor calls. gcc/testsuite/ChangeLog: * gdc.dg/extern-c++/extern-c++.exp: New. * gdc.dg/extern-c++/pr101664.d: New test. * gdc.dg/extern-c++/pr101664_1.cc: New test. Diff: --- gcc/d/expr.cc | 13 +++++++++ gcc/testsuite/gdc.dg/extern-c++/extern-c++.exp | 39 ++++++++++++++++++++++++++ gcc/testsuite/gdc.dg/extern-c++/pr101664.d | 15 ++++++++++ gcc/testsuite/gdc.dg/extern-c++/pr101664_1.cc | 10 +++++++ 4 files changed, 77 insertions(+) diff --git a/gcc/d/expr.cc b/gcc/d/expr.cc index 99ca958c7c4..85269c6b2be 100644 --- a/gcc/d/expr.cc +++ b/gcc/d/expr.cc @@ -1751,6 +1751,7 @@ public: tree callee = NULL_TREE; tree object = NULL_TREE; tree cleanup = NULL_TREE; + tree returnvalue = NULL_TREE; TypeFunction *tf = NULL; /* Calls to delegates can sometimes look like this. */ @@ -1819,6 +1820,15 @@ public: else fndecl = build_address (fndecl); + /* C++ constructors return void, even though front-end semantic + treats them as implicitly returning `this'. Set returnvalue + to override the result of this expression. */ + if (fd->isCtorDeclaration () && fd->linkage == LINKcpp) + { + thisexp = d_save_expr (thisexp); + returnvalue = thisexp; + } + callee = build_method_call (fndecl, thisexp, fd->type); } } @@ -1885,6 +1895,9 @@ public: build the call expression. */ tree exp = d_build_call (tf, callee, object, e->arguments); + if (returnvalue != NULL_TREE) + exp = compound_expr (exp, returnvalue); + if (tf->isref) exp = build_deref (exp); diff --git a/gcc/testsuite/gdc.dg/extern-c++/extern-c++.exp b/gcc/testsuite/gdc.dg/extern-c++/extern-c++.exp new file mode 100644 index 00000000000..d38f993faaf --- /dev/null +++ b/gcc/testsuite/gdc.dg/extern-c++/extern-c++.exp @@ -0,0 +1,39 @@ +# Copyright (C) 2021 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GCC; see the file COPYING3. If not see +# <http://www.gnu.org/licenses/>. + +# Load support procs. +load_lib gdc-dg.exp + +# We are mixing D and C++ code, need to pull in libstdc++ +global GDC_INCLUDE_CXX_FLAGS +set GDC_INCLUDE_CXX_FLAGS 1 + +# Initialize `dg'. +dg-init + +# Main loop. +if [check_no_compiler_messages extern_c++_tests assembly { + // C++ + int main() { return 0; } +}] { + gdc-dg-runtest [lsort \ + [glob -nocomplain $srcdir/$subdir/*.d ] ] "" "" +} + +set GDC_INCLUDE_CXX_FLAGS 0 + +# All done. +dg-finish diff --git a/gcc/testsuite/gdc.dg/extern-c++/pr101664.d b/gcc/testsuite/gdc.dg/extern-c++/pr101664.d new file mode 100644 index 00000000000..57b3d903582 --- /dev/null +++ b/gcc/testsuite/gdc.dg/extern-c++/pr101664.d @@ -0,0 +1,15 @@ +// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101664 +// { dg-do run } +// { dg-options "-O2" } +// { dg-additional-sources "pr101664_1.cc" } + +extern(C++) struct S101664 +{ + int i; + this(int); +} + +void main() +{ + assert(S101664(1).i == 1); +} diff --git a/gcc/testsuite/gdc.dg/extern-c++/pr101664_1.cc b/gcc/testsuite/gdc.dg/extern-c++/pr101664_1.cc new file mode 100644 index 00000000000..066e784293d --- /dev/null +++ b/gcc/testsuite/gdc.dg/extern-c++/pr101664_1.cc @@ -0,0 +1,10 @@ +struct S101664 +{ + int i; + S101664 (int n); +}; + +S101664::S101664 (int n) + : i(n) +{ +}
reply other threads:[~2021-07-29 15:12 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20210729151259.80A1439B3C31@sourceware.org \ --to=ibuclaw@gcc.gnu.org \ --cc=gcc-cvs@gcc.gnu.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).