diff --git a/flang/lib/Parser/prescan.cpp b/flang/lib/Parser/prescan.cpp index 3cd32d7e6c92e..b7462ebfb0900 100644 --- a/flang/lib/Parser/prescan.cpp +++ b/flang/lib/Parser/prescan.cpp @@ -1289,14 +1289,18 @@ const char *Prescanner::FreeFormContinuationLine(bool ampersand) { return nullptr; } p = SkipWhiteSpace(p); - if (InCompilerDirective()) { - if (*p++ != '!') { - return nullptr; - } - for (const char *s{directiveSentinel_}; *s != '\0'; ++p, ++s) { - if (*s != ToLowerCaseLetter(*p)) { - return nullptr; + if (*p == '!') { + ++p; + if (InCompilerDirective()) { + for (const char *s{directiveSentinel_}; *s != '\0'; ++p, ++s) { + if (*s != ToLowerCaseLetter(*p)) { + return nullptr; + } } + } else if (features_.IsEnabled(LanguageFeature::OpenMP) && *p == '$') { + ++p; + } else { + return nullptr; } p = SkipWhiteSpace(p); if (*p == '&') { diff --git a/flang/test/Parser/OpenMP/compiler-directive-continuation.f90 b/flang/test/Parser/OpenMP/compiler-directive-continuation.f90 new file mode 100644 index 0000000000000..87e4a72c54294 --- /dev/null +++ b/flang/test/Parser/OpenMP/compiler-directive-continuation.f90 @@ -0,0 +1,44 @@ +! RUN: %flang_fc1 -fopenmp -E %s 2>&1 | FileCheck %s --check-prefix=CHECK-OMP +! RUN: %flang_fc1 -E %s 2>&1 | FileCheck %s + + +! Test in mixed way, i.e., combination of Fortran free source form +! and free source form with conditional compilation sentinel. +! CHECK-LABEL: subroutine mixed_form1() +! CHECK-OMP: i = 1 +100+ 1000+ 10 + 1 +1000000000 + 1000000 +! CHECK: i = 1 + 10 + 10000 + 1000000 +subroutine mixed_form1() + i = 1 & + !$+100& + !$&+ 1000& + &+ 10 + 1& + !$& +100000& + &0000 + 1000000 +end subroutine + + +! Testing continuation lines in only Fortran Free form Source +! CHECK-LABEL: subroutine mixed_form2() +! CHECK-OMP: i = 1 +10 +100 + 1000 + 10000 +! CHECK: i = 1 +10 +100 + 1000 + 10000 +subroutine mixed_form2() + i = 1 & + +10 & + &+100 + & + 1000 & + + 10000 +end subroutine + + +! Testing continuation line in only free source form conditional compilation sentinel. +! CHECK-LABEL: subroutine mixed_form3() +! CHECK-OMP: i=0 +! CHECK-OMP: i = 1 +10 +100+1000 +subroutine mixed_form3() + !$ i=0 + !$ i = 1 & + !$ & +10 & + !$&+100& + !$ +1000 +end subroutine +