[R-pkg-devel] Single character in Fortran function and FCONE and FCLEN macros

Benjamin Christoffersen boennecd @end|ng |rom gm@||@com
Tue Sep 3 15:07:14 CEST 2019


Dear Sirs,

I have tried to update my 'dynamichazard' package on CRAN but I have
had some issues with the '-Wlto-type-mismatch' checks. In particular,
I have tried to follow "Writing R Extensions" section "Fortran
character strings" and defined a C++ header file
(https://github.com/boennecd/dynamichazard/blob/460fe74cadad5c029c4f0ffb50074139135c2166/src/Rconfig-wrap.h)
with the following content

> #ifndef RCONFIG_WRAP_H
> #define RCONFIG_WRAP_H
> #define USE_FC_LEN_T
> #include <Rconfig.h>
>
> #ifndef FCLEN
> #define FCLEN
> #endif
> #ifndef FCONE
> #define FCONE
> #endif
>
> #endif

which I include before including 'R_ext/BLAS.h' and 'R_ext/Lapack.h'
files. I then make the following C declaration of the Fortran
subroutine that causes the issue
(https://github.com/boennecd/dynamichazard/blob/460fe74cadad5c029c4f0ffb50074139135c2166/src/BLAS_LAPACK/R_BLAS_LAPACK.cpp#L2-L29)

> extern "C"
>   {
>     void F77_NAME(dchur)(
>         const char*,   // UPLO
>         const char*,   // TRANS
>         int*,    // N
>         int*,    // M
>         double*, // R
>         int*,    // LDR
>         double*, // X
>         double*, // Z
>         int*,    // LDZ
>         double*, // Y
>         double*, // RHO
>         double*, // C
>         double*, // S
>         int*     // INFO,
>         FCLEN FCLEN
>     );
>   }

Lastly, I use the 'FCONE' macro when calling the function. The Fortran
subroutine (a LINPACK subroutine) is defined in this file:
https://github.com/boennecd/dynamichazard/blob/460fe74cadad5c029c4f0ffb50074139135c2166/src/BLAS_LAPACK/dchur.f#L7

I gather the above is as done in the BLAS and LAPACK header in R. Yet,
I still got a mail in the CRAN submission stating that

> We see
>
> * checking whether package ‘dynamichazard’ can be installed ...
> [207s/211s] WARNING
> Found the following significant warnings:
>    BLAS_LAPACK/R_BLAS_LAPACK.cpp:12:10: warning: type of ‘dchur_’ does
> not match original declaration [-Wlto-type-mismatch]
>
> and there's also
>
> BLAS_LAPACK/R_BLAS_LAPACK.cpp:12:10: warning: type of ‘dchur_’ does not
> match original declaration [-Wlto-type-mismatch]
>     12 |     void F77_NAME(dchur)(
>        |          ^
> BLAS_LAPACK/dchur.f:7:1: note: type mismatch in parameter 15
>      7 |       SUBROUTINE DCHUR(UPLO,TRANS,N,M,R,LDR,X,Z,LDZ,Y,RHO,C,S,INFO)
>        | ^
> BLAS_LAPACK/dchur.f:7:1: note: type ‘long int’ should match type ‘void’
> BLAS_LAPACK/dchur.f:7:1: note: ‘dchur’ was previously declared here

I am not sure how to handle the issue. I am sorry if I am doing
something which is obviously wrong.

I also got some messages about the declarations in RcppArmadillo but I
gather these are upstream issues which I cannot do anything about
> /home/Hornik/tmp/R-d-gcc-LTO/include/R_ext/Lapack.h:1584:1: warning: ‘dtrtri_’ violates the C++ One Definition Rule [-Wodr]
>  1584 | F77_NAME(dtrtri)(const char* uplo, const char* diag,
>       | ^
> /home/Hornik/lib/R/Library/3.7/x86_64-linux-gnu/RcppArmadillo/include/armadillo_bits/def_lapack.hpp:421:8: note: type mismatch in parameter 7
>   421 |   void arma_fortran(arma_dtrtri)(const char* uplo, const char* diag, const blas_int* n, double* a, const blas_int* lda, blas_int* info, blas_len uplo_len, blas_len diag_len);
>       |        ^
> /home/Hornik/lib/R/Library/3.7/x86_64-linux-gnu/RcppArmadillo/include/armadillo_bits/def_lapack.hpp:421:8: note: type ‘blas_len’ should match type ‘void’
> /home/Hornik/lib/R/Library/3.7/x86_64-linux-gnu/RcppArmadillo/include/armadillo_bits/def_lapack.hpp:421:8: note: ‘dtrtri_’ was previously declared here
> /home/Hornik/tmp/R-d-gcc-LTO/include/R_ext/BLAS.h:242:1: warning: ‘dsyrk_’ violates the C++ One Definition Rule [-Wodr]
>   242 | F77_NAME(dsyrk)(const char *uplo, const char *trans,
>       | ^
> /home/Hornik/lib/R/Library/3.7/x86_64-linux-gnu/RcppArmadillo/include/armadillo_bits/def_blas.hpp:110:8: note: type mismatch in parameter 11
>   110 |   void arma_fortran(arma_dsyrk)(const char* uplo, const char* transA, const blas_int* n, const blas_int* k, const double* alpha, const double* > A, const blas_int* ldA, const double* beta, double* C, const blas_int* ldC, blas_len uplo_len, blas_len transA_len);
>       |        ^
> /home/Hornik/lib/R/Library/3.7/x86_64-linux-gnu/RcppArmadillo/include/armadillo_bits/def_blas.hpp:110:8: note: type ‘blas_len’ should match type ‘void’
> /home/Hornik/lib/R/Library/3.7/x86_64-linux-gnu/RcppArmadillo/include/armadillo_bits/def_blas.hpp:110:8: note: ‘dsyrk_’ was previously declared here
> /home/Hornik/tmp/R-d-gcc-LTO/include/R_ext/Lapack.h:825:1: warning: ‘dpotrf_’ violates the C++ One Definition Rule [-Wodr]
>   825 | F77_NAME(dpotrf)(const char* uplo, const int* n,
>       | ^
> /home/Hornik/lib/R/Library/3.7/x86_64-linux-gnu/RcppArmadillo/include/armadillo_bits/def_lapack.hpp:467:8: note: type mismatch in parameter 6
>   467 |   void arma_fortran(arma_dpotrf)(const char* uplo, const blas_int* n, double* a, const blas_int* lda, blas_int* info, blas_len uplo_len);
>       |        ^
> /home/Hornik/lib/R/Library/3.7/x86_64-linux-gnu/RcppArmadillo/include/armadillo_bits/def_lapack.hpp:467:8: note: type ‘blas_len’ should match type ‘void’
> /home/Hornik/lib/R/Library/3.7/x86_64-linux-gnu/RcppArmadillo/include/armadillo_bits/def_lapack.hpp:467:8: note: ‘dpotrf_’ was previously declared here
> installing to /home/Hornik/tmp/CRAN/dynamichazard.Rcheck/00LOCK-dynamichazard/00new/dynamichazard/libs

Sincerely Yours,
Benjamin Christoffersen



More information about the R-package-devel mailing list