https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113904
--- Comment #3 from Tobias Burnus <burnus at gcc dot gnu.org> --- See comment 1 for remaining to-do items. I also note that the Fortran resolution comes too early - during parsing - as the following shows: module m implicit none contains subroutine test !$omp declare variant (foo) match(user={condition(myTrue)}) !$omp declare variant (bar) match(user={condition(myCond(1).and.myCond(2))}) logical, parameter :: myTrue = .true. end subroutine foo; end subroutine bar; end logical function myCond(i) integer :: i myCond = i < 3 end end module m This fails with the complete bogus: 5 | !$omp declare variant (foo) match(user={condition(myTrue)}) | 1 Error: property must be a constant logical expression at (1) As 'myTrue' is a scalar logical PARAMETER. The problem is just that this is not known when parsing '!$omp' - for that reason, Fortran separates parsing and resolution, which the current code does not handle as it comes way too early. * * * Otherwise: It looks as if - except for simple variable names (and probablyalso for functions calls w/o arguments) - we want to introduce an internal aux function like: logical function __m_MOD_test_DV_cond1() result(res) res = myCond(1).and.myCond(2) end which is then called when evaluating the run-time expression. With header files and, possibly, also C++ modules, we might be able to always inline the condition - with Fortran modules probably not, such that an aux function would be needed for the generic case.