Skip to content

Commit 23f86ab

Browse files
committed
add bool/logical example
1 parent 62b8278 commit 23f86ab

File tree

6 files changed

+59
-0
lines changed

6 files changed

+59
-0
lines changed

src/c/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ add_library(error_c OBJECT error_lib.c)
66

77

88
# -- C calling Fortran
9+
add_executable(c_fortran_bool bool_main.c)
10+
target_link_libraries(c_fortran_bool PRIVATE bool_fortran)
11+
add_test(NAME C_Fortran_bool COMMAND c_fortran_bool)
12+
913
add_executable(c_fortran_submodule submodule_main.c)
1014
target_link_libraries(c_fortran_submodule PRIVATE submodule_fortran)
1115
set_target_properties(c_fortran_submodule PROPERTIES LINKER_LANGUAGE C)

src/c/bool_main.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#include <stdbool.h>
2+
#include <stdio.h>
3+
4+
extern bool logical_not(bool);
5+
6+
int main(void){
7+
8+
if (!logical_not(false)) {
9+
fprintf(stderr, "expected Fortran to not boolean");
10+
return 1;
11+
}
12+
13+
printf("OK: boolean-logical not\n");
14+
return 0;
15+
}

src/cxx/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ target_include_directories(struct_cxx PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../c)
66
add_library(error_cxx OBJECT error_lib.cxx)
77

88
# -- C++ calling Fortran
9+
add_executable(cxx_fortran_bool bool_main.cxx)
10+
target_link_libraries(cxx_fortran_bool PRIVATE bool_fortran)
11+
add_test(NAME C++_Fortran_bool COMMAND cxx_fortran_bool)
12+
913
add_executable(cxx_fortran_submodule submodule_main.cxx)
1014
target_link_libraries(cxx_fortran_submodule PRIVATE submodule_fortran)
1115
target_compile_definitions(cxx_fortran_submodule PRIVATE _USE_MATH_DEFINES)

src/cxx/bool_main.cxx

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#include <iostream>
2+
3+
extern "C" bool logical_not(bool);
4+
5+
int main(){
6+
7+
if (!logical_not(false)) {
8+
std::cerr << "expected Fortran to not boolean" << std::endl;
9+
return EXIT_FAILURE;
10+
}
11+
12+
std::cout << "OK: boolean-logical not" << std::endl;
13+
return EXIT_SUCCESS;
14+
}

src/fortran/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
add_library(bool_fortran bool_lib.f90)
2+
13
add_library(vector_fortran OBJECT vector_lib.f90)
24

35
add_library(error_fortran OBJECT error_lib.f90)

src/fortran/bool_lib.f90

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
module logbool
2+
3+
use, intrinsic :: iso_c_binding, only : c_bool
4+
5+
implicit none (type, external)
6+
7+
contains
8+
9+
logical(c_bool) function logical_not(L) bind(C)
10+
11+
logical(c_bool), intent(in), value :: L
12+
logical :: byte_default
13+
14+
logical_not = .not. L
15+
16+
print '(a,i0,1x,i0)', "C, Fortran logical bits: ", storage_size(L), storage_size(byte_default)
17+
18+
end function logical_not
19+
20+
end module logbool

0 commit comments

Comments
 (0)