https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79305

kargl at gcc dot gnu.org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |kargl at gcc dot gnu.org

--- Comment #1 from kargl at gcc dot gnu.org ---
(In reply to Anton Shterenlikht from comment #0)
> FreeBSD 11.0-RELEASE-p2
> 
> use, intrinsic :: iso_fortran_env, only: real128
> integer, parameter :: fk = real128
> complex( kind=fk ) :: z
> z = cmplx( 1.0_fk, -1.0_fk, kind=fk )
> write (*,*) exp( z )
> end
> 
> $ gfortran49 z.f90 
> /tmp//ccIF7kVE.o: In function `MAIN__':
> z.f90:(.text+0x79): undefined reference to `cexpl'
> collect2: error: ld returned 1 exit status
> 
> Have I missed something?
> 

Yes, probably a few things.  What are you trying to
accomplish with using REAL128?  This maps to REAL(10)
instead of REAL(16).  The end resutl is that z will
have a 64-bit significand whereas the name REAL128
suggests that it should have a 113-bit significand.

In additional, FreeBSD's libm does not have a cexpl
function.  You'll need to submit a bug report with
FreeBSD; although it won't help much as no one is 
actively working on FreeBSD's libm shortcomings.

config.h in obj7/x86_64-unknown-freebsd12.0/libgfortran
shows the expected

/* Define to 1 if you have the `cexpl' function. */
/* #undef HAVE_CEXPL */

This then gets you to gcc7/libgfortran/c99_protos.h

#if !defined(HAVE_CEXPL) && defined(HAVE_COSL) && defined(HAVE_SINL) &&
defined(EXPL)
#define HAVE_CEXPL 1
extern long double complex cexpl (long double complex);
#endif

so cexpl is exposed to libgfortran; howerver, one then find
in intrinsics/c99_functions.c

#if !defined(HAVE_CEXPL) && defined(HAVE_COSL) && defined(HAVE_SINL) &&
defined(EXPL)
#define HAVE_CEXPL 1
long double complex cexpl (long double complex z);

long double complex
cexpl (long double complex z)
{
  long double a, b;
  long double complex v;

  a = REALPART (z);
  b = IMAGPART (z);
  COMPLEX_ASSIGN (v, cosl (b), sinl (b));
  return expl (a) * v;
}
#endif

The above will clearly never be built. In fact, a causal perusal
of c99_protos.h shows that none of the fallback functions in
c99_functions.c are built.

Reply via email to