From 6ff15a5aa67d57d72112bec43a7920820bbe4927 Mon Sep 17 00:00:00 2001 From: Jack Styles Date: Fri, 4 Jul 2025 15:44:58 +0100 Subject: [PATCH 1/2] [Flang][OpenMP] Push context when parsing DECLARE VARIANT Basic parsing and semantics support for Declare Variant was added in PR 130578. However, this did not include variant of `Pre` and `Post` within `OmpAttributeVisitor`. This meant that when a function in the class tried to get the context using `GetContext`, Flang would crash as the context was empty. To ensure this is possible, such as when resolving names as part of the `uniform` clause in the `simd` directive, the context is now pushed within `OmpAttributeVisitor` when parsing a `DECLARE VARIANT` directive. Fixes #145222 --- flang/lib/Semantics/resolve-directives.cpp | 6 +++++ flang/test/Parser/OpenMP/declare-variant.f90 | 27 ++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/flang/lib/Semantics/resolve-directives.cpp b/flang/lib/Semantics/resolve-directives.cpp index 8d741734601a7..0d11b4a21ca3d 100644 --- a/flang/lib/Semantics/resolve-directives.cpp +++ b/flang/lib/Semantics/resolve-directives.cpp @@ -495,6 +495,12 @@ class OmpAttributeVisitor : DirectiveAttributeVisitor { bool Pre(const parser::OpenMPAllocatorsConstruct &); void Post(const parser::OpenMPAllocatorsConstruct &); + bool Pre(const parser::OmpDeclareVariantDirective &x) { + PushContext(x.source, llvm::omp::Directive::OMPD_declare_variant); + return true; + } + void Post (const parser::OmpDeclareVariantDirective &) { PopContext(); }; + void Post(const parser::OmpObjectList &x) { // The objects from OMP clauses should have already been resolved, // except common blocks (the ResolveNamesVisitor does not visit diff --git a/flang/test/Parser/OpenMP/declare-variant.f90 b/flang/test/Parser/OpenMP/declare-variant.f90 index 1b97733ea9525..3366b143e62e6 100644 --- a/flang/test/Parser/OpenMP/declare-variant.f90 +++ b/flang/test/Parser/OpenMP/declare-variant.f90 @@ -102,3 +102,30 @@ subroutine vsub(v1, v2) type(c_ptr), value :: v1, v2 end end subroutine + +subroutine f + real :: x, y + y = 2 + !omp simd + call f2(x, y) + !omp end simd +contains + subroutine f1 (x, y) + real :: x, y + end + + subroutine f2 (x, y) + real :: x, y + !$omp declare variant (f1) match (construct={simd(uniform(y))}) + end +end subroutine +!CHECK: !$OMP DECLARE VARIANT (f1) MATCH(CONSTRUCT={SIMD(UNIFORM(y))}) +!PARSE-TREE: | | | | DeclarationConstruct -> SpecificationConstruct -> OpenMPDeclarativeConstruct -> OmpDeclareVariantDirective +!PARSE-TREE-NEXT: | | | | | Verbatim +!PARSE-TREE-NEXT: | | | | | Name = 'f1' +!PARSE-TREE-NEXT: | | | | | OmpClauseList -> OmpClause -> Match -> OmpMatchClause -> OmpContextSelectorSpecification -> OmpTraitSetSelector +!PARSE-TREE-NEXT: | | | | | | OmpTraitSetSelectorName -> Value = Construct +!PARSE-TREE-NEXT: | | | | | | OmpTraitSelector +!PARSE-TREE-NEXT: | | | | | | | OmpTraitSelectorName -> Value = Simd +!PARSE-TREE-NEXT: | | | | | | | Properties +!PARSE-TREE-NEXT: | | | | | | | | OmpTraitProperty -> OmpClause -> Uniform -> Name = 'y' From 3e246b0286b9d760a24a890d1b9c283b0762fa2a Mon Sep 17 00:00:00 2001 From: Jack Styles Date: Fri, 4 Jul 2025 16:10:38 +0100 Subject: [PATCH 2/2] formatting fixes --- flang/lib/Semantics/resolve-directives.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flang/lib/Semantics/resolve-directives.cpp b/flang/lib/Semantics/resolve-directives.cpp index 0d11b4a21ca3d..299bb6ff876e7 100644 --- a/flang/lib/Semantics/resolve-directives.cpp +++ b/flang/lib/Semantics/resolve-directives.cpp @@ -499,7 +499,7 @@ class OmpAttributeVisitor : DirectiveAttributeVisitor { PushContext(x.source, llvm::omp::Directive::OMPD_declare_variant); return true; } - void Post (const parser::OmpDeclareVariantDirective &) { PopContext(); }; + void Post(const parser::OmpDeclareVariantDirective &) { PopContext(); }; void Post(const parser::OmpObjectList &x) { // The objects from OMP clauses should have already been resolved,