diff --git a/flang/include/flang/ISO_Fortran_binding.h b/flang/include/flang/ISO_Fortran_binding.h index 4a28d3322a38f..3f74a7e56f175 100644 --- a/flang/include/flang/ISO_Fortran_binding.h +++ b/flang/include/flang/ISO_Fortran_binding.h @@ -125,7 +125,7 @@ namespace cfi_internal { // The below structure emulates a flexible array. This structure does not take // care of getting the memory storage. Note that it already contains one element // because a struct cannot be empty. -template struct FlexibleArray : T { +extern "C++" template struct FlexibleArray : T { RT_API_ATTRS T &operator[](int index) { return *(this + index); } const RT_API_ATTRS T &operator[](int index) const { return *(this + index); } RT_API_ATTRS operator T *() { return this; } @@ -163,12 +163,12 @@ typedef struct CFI_cdesc_t { // needed, for C++'s CFI_cdesc_t's emulated flexible // dim[] array. namespace cfi_internal { -template struct CdescStorage : public CFI_cdesc_t { +extern "C++" template struct CdescStorage : public CFI_cdesc_t { static_assert((r > 1 && r <= CFI_MAX_RANK), "CFI_INVALID_RANK"); CFI_dim_t dim[r - 1]; }; -template <> struct CdescStorage<1> : public CFI_cdesc_t {}; -template <> struct CdescStorage<0> : public CFI_cdesc_t {}; +extern "C++" template <> struct CdescStorage<1> : public CFI_cdesc_t {}; +extern "C++" template <> struct CdescStorage<0> : public CFI_cdesc_t {}; } // namespace cfi_internal #define CFI_CDESC_T(rank) \ FORTRAN_ISO_NAMESPACE_::cfi_internal::CdescStorage diff --git a/flang/test/Integration/iso-fortran-binding.cpp b/flang/test/Integration/iso-fortran-binding.cpp new file mode 100644 index 0000000000000..aaafd7cccd07d --- /dev/null +++ b/flang/test/Integration/iso-fortran-binding.cpp @@ -0,0 +1,33 @@ +// UNSUPPORTED: system-windows +// RUN: split-file %s %t +// RUN: chmod +x %t/runtest.sh +// RUN: %t/runtest.sh %t %t/cppfile.cpp %flang | FileCheck %s + +//--- cppfile.cpp +extern "C" { +#include "ISO_Fortran_binding.h" +} +#include + +int main() { + std::cout << "PASS\n"; + return 0; +} + +// CHECK: PASS +// clang-format off +//--- runtest.sh +#!/bin/bash +TMPDIR=$1 +CPPFILE=$2 +FLANG=$3 +BINDIR=`dirname $FLANG` +CPPCOMP=$BINDIR/clang++ +if [ -x $CPPCOMP ] +then + $CPPCOMP $CPPFILE -o $TMPDIR/a.out + $TMPDIR/a.out # should print "PASS" +else + # No clang compiler, just pass by default + echo "PASS" +fi