Index: flang/lib/Semantics/check-declarations.cpp =================================================================== --- flang/lib/Semantics/check-declarations.cpp +++ flang/lib/Semantics/check-declarations.cpp @@ -1869,11 +1869,11 @@ } } -// Check that BIND(C) names are distinct and BIND(C) variable declared in module void CheckHelper::CheckBindC(const Symbol &symbol) { if (!symbol.attrs().test(Attr::BIND_C)) { return; } + CheckConflicting(symbol, Attr::BIND_C, Attr::PARAMETER); if (symbol.has() && !symbol.owner().IsModule()) { messages_.Say(symbol.name(), "A variable with BIND(C) attribute may only appear in the specification part of a module"_err_en_US); Index: flang/test/Semantics/declarations02.f90 =================================================================== --- /dev/null +++ flang/test/Semantics/declarations02.f90 @@ -0,0 +1,32 @@ +! RUN: %python %S/test_errors.py %s %flang_fc1 + +module m + !ERROR: 'x1' may not have both the BIND(C) and PARAMETER attributes + integer, parameter, bind(c, name="a") :: x1 = 1 + !ERROR: 'x2' may not have both the BIND(C) and PARAMETER attributes + integer, bind(c), parameter :: x2 = 1 + + !ERROR: 'x3' may not have both the BIND(C) and PARAMETER attributes + integer, parameter :: x3 = 1 + bind(c) :: x3 + + type :: my_type1 + integer :: x4 + end type + type, bind(c) :: my_type2 + integer :: x5 + end type + + !ERROR: 't1' may not have both the BIND(C) and PARAMETER attributes + type(my_type1), bind(c), parameter :: t1 = my_type1(1) + !ERROR: 't2' may not have both the BIND(C) and PARAMETER attributes + type(my_type2), bind(c), parameter :: t2 = my_type2(1) + + type(my_type2), parameter :: t3 = my_type2(1) ! no error + !ERROR: 't4' may not have both the BIND(C) and PARAMETER attributes + type(my_type1), parameter :: t4 = my_type1(1) + !ERROR: 't5' may not have both the BIND(C) and PARAMETER attributes + type(my_type2), parameter :: t5 = my_type2(1) + bind(c) :: t4, t5 + +end