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. */
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);
}
}
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);
--- /dev/null
+# 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
--- /dev/null
+// 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);
+}