[flang-commits] [flang] [Flang][OpenMP] Push context when parsing DECLARE VARIANT (PR #147075)
via flang-commits
flang-commits at lists.llvm.org
Fri Jul 4 08:05:32 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-flang-parser
@llvm/pr-subscribers-flang-semantics
Author: Jack Styles (Stylie777)
<details>
<summary>Changes</summary>
Basic parsing and semantics support for Declare Variant was added in #<!-- -->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
---
Full diff: https://github.com/llvm/llvm-project/pull/147075.diff
2 Files Affected:
- (modified) flang/lib/Semantics/resolve-directives.cpp (+6)
- (modified) flang/test/Parser/OpenMP/declare-variant.f90 (+27)
``````````diff
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<llvm::omp::Directive> {
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'
``````````
</details>
https://github.com/llvm/llvm-project/pull/147075
More information about the flang-commits
mailing list