From 7616ed6307c90b5bbf1bf53550d33cc674ab4b6f Mon Sep 17 00:00:00 2001 From: Iain Buclaw Date: Mon, 26 Jul 2021 19:34:33 +0200 Subject: 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. --- 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 +++++++ 3 files changed, 64 insertions(+) create mode 100644 gcc/testsuite/gdc.dg/extern-c++/extern-c++.exp create mode 100644 gcc/testsuite/gdc.dg/extern-c++/pr101664.d create mode 100644 gcc/testsuite/gdc.dg/extern-c++/pr101664_1.cc (limited to 'gcc/testsuite/gdc.dg') 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 0000000..d38f993 --- /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 +# . + +# 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 0000000..57b3d90 --- /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 0000000..066e784 --- /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) +{ +} -- cgit v1.1