aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Sema/SemaOpenMP.cpp
AgeCommit message (Collapse)AuthorFilesLines
41 hours[clang][OpenMP] Support for reduction clause with array elements as modifier ↵SunilKuravinakop1-1/+2
(#160846) Changes to support for array elements in reduction clause e.g. "reduction (+:a[1])" --------- Co-authored-by: Sunil Kuravinakop <kuravina@pe31.hpc.amslabs.hpecorp.net>
2 days[Clang][OpenMP][LoopTransformations] Implement "#pragma omp fuse" loop ↵Walter J.T.V1-28/+802
transformation directive and "looprange" clause (#139293) This change implements the fuse directive, `#pragma omp fuse`, as specified in the OpenMP 6.0, along with the `looprange` clause in clang. This change also adds minimal stubs so flang keeps compiling (a full implementation in flang of this directive is still pending). --------- Co-authored-by: Roger Ferrer Ibanez <roger.ferrer@bsc.es>
13 days[clang] [OpenMP] New OpenMP 6.0 - Parsing and Sema support for groupprivate ↵Ritanya-B-Bharadwaj1-15/+115
(#158134)
13 days[OpenMP 5.2] New syntax for 'uses_allocators' clause (#157025)Urvi Rav1-4/+6
This patch updates the parsing changes to handle the new syntax of the `uses_allocators` clause as defined in OpenMP 5.2(Section 6.8). ``` // Case 1: Allocator without traits // < 5.2 → error // ≥ 5.2 → OK, empty traits set #pragma omp target teams uses_allocators(cgroup_alloc) // Case 2: Allocator with traits // Old syntax (< 5.2): #pragma omp target teams uses_allocators(cgroup_alloc(cgroup_traits)) // New syntax (≥ 5.2): #pragma omp target teams uses_allocators(traits(cgroup_traits) : cgroup_alloc) // Case 3: Multiple allocators // Old syntax (< 5.2), comma-separated: #pragma omp target teams uses_allocators(cgroup_alloc(cgroup_traits), aligned_alloc(aligned_traits)) // New syntax (≥ 5.2), semicolon-separated: #pragma omp target teams uses_allocators(traits(cgroup_traits) : cgroup_alloc; traits(aligned_traits) : aligned_alloc) ``` --------- Co-authored-by: urvi-rav <urvi.rav@hpe.com>
2025-09-16[clang][OpenMP] 6.0: Add defaultmap implicit-behavior 'private' (#158712)David Pagan1-4/+9
Per OpenMP 6.0 specification, section 7.9.9 Argument keywords, page 291, L17 Semantics, page 292, L15-16 The behavior of 'private' should be described in the same manner as that of 'firstprivate' 15 ... If implicit-behavior is firstprivate, 16 the attribute is a data-sharing attribute of firstprivate. Relevant OpenMP 6.0 issues defaultmap clause new implicit-behavior 'private' should be documented https://github.com/OpenMP/spec/issues/4571 Issue 4571: Add missing sentence about private to defaultmap https://github.com/OpenMP/spec/pull/4577 Testing: Updated 'defaultmap' error message and codegen LIT tests to verify behavior of 'private' in OpenMP 6.0.
2025-09-16[Clang][OpenMP] Add an additional class to hold data that will be shared ↵Roger Ferrer Ibáñez1-5/+7
between all loop transformations (#155849) This is preparatory work for the implementation of `#pragma omp fuse` in https://github.com/llvm/llvm-project/pull/139293 **Note**: this change builds on top of https://github.com/llvm/llvm-project/pull/155848 This change adds an additional class to hold data that will be shared between all loop transformations: those that apply to canonical loop nests (the majority) and those that apply to canonical loop sequences (`fuse` in OpenMP 6.0). This class is not a statement by itself and its goal is to avoid having to replicate information between classes. Also simplfiy the way we handle the "generated loops" information as we currently only need to know if it is zero or non-zero.
2025-09-15[clang][OpenMP] 6.0: Add defaultmap implicit-behavior 'storage' (#158336)David Pagan1-3/+8
First of two patches split from original defaultmap PR: https://github.com/llvm/llvm-project/pull/157767 Per OpenMP 6.0 specification, section 7.9.9 Argument keywords, page 291, L17 Additional information, page 291, L24-25 24 The value alloc may also be specified as implicit-behavior with identical meaning to the value 25 storage. Testing: Updated 'defaultmap' error message and codegen LIT tests to verify behavior in OpenMP 6.0.
2025-09-15[Clang][OpenMP]Default clause variable category (#157063)SunilKuravinakop1-19/+106
Support for Variable Category in Default Clause. --------- Co-authored-by: Sunil Kuravinakop <kuravina@pe31.hpc.amslabs.hpecorp.net>
2025-09-08[Clang][NFC] Rename OMPLoopTransformationDirective to ↵Roger Ferrer Ibáñez1-2/+4
OMPCanonicalLoopNestTransformationDirective (#155848) This is preparatory work for the implementation of `#pragma omp fuse` in https://github.com/llvm/llvm-project/pull/139293 Not all OpenMP loop transformations makes sense to make them inherit from `OMPLoopBasedDirective`, in particular in OpenMP 6.0 'fuse' (to be implemented later) is a transformation of a canonical loop sequence. This change renames class `OMPLoopTransformationDirective` to `OMPCanonicalLoopNestTransformationDirective` so we can reclaim that name in a later change.
2025-09-04Trying to fix undefined symbol error caused by iterator variable (#141507)ShashwathiNavada1-1/+10
When a mapper is declared with an iterator variable inside the map clause, it results in unintended behavior due to the iterator being implicitly created but left uninitialized. Testcase: ``` typedef struct myvec{ size_t len; double *data; } myvec_t; #pragma omp declare mapper(id:myvec_t v) map( iterator( iterator_variable=0:v.len), tofrom: v.data[iterator_variable]) int main() { int errors = 0; myvec_t s; #pragma omp target map(mapper(id), to:s) { } return 0; } ``` The error we get while compiling this is: ``` /usr/lib64/gcc/x86_64-suse-linux/14/../../../../x86_64-suse-linux/bin/ld: /tmp/test-f70647.o: in function `.omp_mapper._ZTS5myvec.id': test.cpp:(.text+0x21a): undefined reference to `iterator_variable' /llvm-project/install/bin/clang-linker-wrapper: error: 'ld' failed clang++: error: linker command failed with exit code 1 (use -v to see invocation) ``` This patch tries to fix this by initializing the iterator variable to a null constant. --------- Co-authored-by: Shashwathi N <nshashwa@pe31.hpc.amslabs.hpecorp.net>
2025-09-03[clang][OpenMP] 6.0: detect privatization of array section/assumed-size ↵David Pagan1-10/+36
array (#152786) According to the OpenMP 6.0 specification, array sections with no length and unknown size are considered assumed-size arrays. As of pull request https://github.com/llvm/llvm-project/pull/148048 these types of array sections are allowed and can be specified in clauses that allow array sections as list items. However, only two clauses explicitly allow array sections that are assumed-size arrays: - 'map' and 'use_device_addr'. The other clauses that accept array sections do not explicitly accept assumed-size arrays: - inclusive, exclusive, has_device_addr, in_reduction, task_reduction, reduction These cases should generate an error. See OpenMP 6.0 specification section 7.4 List Item Privatization, Restrictions, p. 222, L15 Assumed-size arrays must not be privatized For OpenMP 6.0, function getPrivateItem() now checks for array section list items that are assumed-size arrays and generates an error if they are not allowed for the clause. Testing - Updated LIT tests for assumed-size array sections to ensure these clauses generate an error: inclusive, exclusive, has_device_addr, in_reduction, task_reduction, reduction and that this clause is accepted (codegen test): use_device_addr - check-all - OpenMP_VV (sollve_vv)
2025-09-02[OpenMP][clang] Fix CaptureRegion for message clause (#156525)Robert Imschweiler1-2/+6
Fixes https://github.com/llvm/llvm-project/issues/156232
2025-08-29Singleton hack of fixing static initialisation order fiasco (#154541)dalmurii1-2/+2
https://github.com/llvm/llvm-project/issues/154528 # Brief Indirect linking of llvm as a shared library is causing a "free() invalid size abortion". In my case, my project depends on google/clspv which in turn pulls `llvm`. Note that the issue does not occur when `clspv` and `llvm` is all statically linked. # Structure of a project which might be causing an error [google/clspv](https://github.com/google/clspv) has been depending on this project (llvm-project), as a static library. My personal project has been depending on [google/clspv](https://github.com/google/clspv) as a shared library. So `MyProject` was linked to shared object `clspv_core.so` which is containing `llvm-project` as its component. # Problem Linking `llvm-project` indirectly to `MyProject` via `clspv_core` was causing the `free() invalid size` abortion. > When library is all statically linked, this problem did not occur. [This issue](https://github.com/llvm/llvm-project/issues/154528) has a full log of the programme running with valgrind. # Reason in my expectation `KnownAssumptionStrings` from [clang/lib/Sema/SemaOpenMP.cpp](https://github.com/llvm/llvm-project/pull/154541/files#diff-032b46da5a8b94f6d8266072e296726c361066e32139024c86dcba5bf64960fc), [llvm/include/llvm/IR/Assumptions.h](https://github.com/llvm/llvm-project/pull/154541/files#diff-ebb09639e5957c2e4d27be9dcb1b1475da67d88db829d24ed8039f351a63ccff), [llvm/lib/IR/Assumptions.cpp](https://github.com/llvm/llvm-project/pull/154541/files#diff-1b490dd29304c875364871e35e1cc8e47bf71898affe3a4dbde6eb91c4016d06) and `FeatureMap` from [llvm/lib/Analysis/MLInlineAdvisor.cpp](https://github.com/llvm/llvm-project/pull/154541/files#diff-26c738eb291410ed83595a4162de617e8cbebddb46331f56d39d193868e29857), [llvm/include/llvm/Analysis/InlineModelFeatureMaps.h](https://github.com/llvm/llvm-project/pull/154541/files#diff-3b5a3359b2a0784186fb3f90dfabf905e8640b6adfd7d2c75259a6835751a6a7) which have been placed on global scope, causing static initialisation order ficasso when indirectly linked by `Myproject`. # Fix trial Changing those global instances I've mentioned ~ `KnownAssumptionStrings` and `FeatureMap` ~ to functions which return a static variable's left value ~ `getKnownAssumptionStrings()`, `getFeatureMap()` ~ has solved my personal problem, so I am pulling a request of it.
2025-08-28Reland: [OpenMP][clang] 6.0: num_threads strict (part 3: codegen) (#155839)Robert Imschweiler1-13/+37
OpenMP 6.0 12.1.2 specifies the behavior of the strict modifier for the num_threads clause on parallel directives, along with the message and severity clauses. This commit implements necessary codegen changes.
2025-08-28Revert "[OpenMP][clang] 6.0: num_threads strict (part 3: codegen)" (#155809)Robert Imschweiler1-36/+12
Reverts llvm/llvm-project#146405
2025-08-28[OpenMP][clang] 6.0: num_threads strict (part 3: codegen) (#146405)Robert Imschweiler1-12/+36
OpenMP 6.0 12.1.2 specifies the behavior of the strict modifier for the num_threads clause on parallel directives, along with the message and severity clauses. This commit implements necessary codegen changes.
2025-08-26[clang] NFC: introduce Type::getAsEnumDecl, and cast variants for all ↵Matheus Izvekov1-3/+3
TagDecls (#155463) And make use of those. These changes are split from prior PR #155028, in order to decrease the size of that PR and facilitate review.
2025-08-09[clang] Improve nested name specifier AST representation (#147835)Matheus Izvekov1-5/+8
This is a major change on how we represent nested name qualifications in the AST. * The nested name specifier itself and how it's stored is changed. The prefixes for types are handled within the type hierarchy, which makes canonicalization for them super cheap, no memory allocation required. Also translating a type into nested name specifier form becomes a no-op. An identifier is stored as a DependentNameType. The nested name specifier gains a lightweight handle class, to be used instead of passing around pointers, which is similar to what is implemented for TemplateName. There is still one free bit available, and this handle can be used within a PointerUnion and PointerIntPair, which should keep bit-packing aficionados happy. * The ElaboratedType node is removed, all type nodes in which it could previously apply to can now store the elaborated keyword and name qualifier, tail allocating when present. * TagTypes can now point to the exact declaration found when producing these, as opposed to the previous situation of there only existing one TagType per entity. This increases the amount of type sugar retained, and can have several applications, for example in tracking module ownership, and other tools which care about source file origins, such as IWYU. These TagTypes are lazily allocated, in order to limit the increase in AST size. This patch offers a great performance benefit. It greatly improves compilation time for [stdexec](https://github.com/NVIDIA/stdexec). For one datapoint, for `test_on2.cpp` in that project, which is the slowest compiling test, this patch improves `-c` compilation time by about 7.2%, with the `-fsyntax-only` improvement being at ~12%. This has great results on compile-time-tracker as well: ![image](https://github.com/user-attachments/assets/700dce98-2cab-4aa8-97d1-b038c0bee831) This patch also further enables other optimziations in the future, and will reduce the performance impact of template specialization resugaring when that lands. It has some other miscelaneous drive-by fixes. About the review: Yes the patch is huge, sorry about that. Part of the reason is that I started by the nested name specifier part, before the ElaboratedType part, but that had a huge performance downside, as ElaboratedType is a big performance hog. I didn't have the steam to go back and change the patch after the fact. There is also a lot of internal API changes, and it made sense to remove ElaboratedType in one go, versus removing it from one type at a time, as that would present much more churn to the users. Also, the nested name specifier having a different API avoids missing changes related to how prefixes work now, which could make existing code compile but not work. How to review: The important changes are all in `clang/include/clang/AST` and `clang/lib/AST`, with also important changes in `clang/lib/Sema/TreeTransform.h`. The rest and bulk of the changes are mostly consequences of the changes in API. PS: TagType::getDecl is renamed to `getOriginalDecl` in this patch, just for easier to rebasing. I plan to rename it back after this lands. Fixes #136624 Fixes https://github.com/llvm/llvm-project/issues/43179 Fixes https://github.com/llvm/llvm-project/issues/68670 Fixes https://github.com/llvm/llvm-project/issues/92757
2025-07-23[clang][Sema][NFC] Fixed incorrect assert messages in SemaOpenMP (#150305)David Pagan1-9/+9
2025-07-23[clang][OpenMP] In 6.0, can omit length in array section (#148048)David Pagan1-1/+1
In OpenMP 6.0 specification, section 5.2.5 Array Sections, page 166, lines 28-28: When the length is absent and the size of the dimension is not known, the array section is an assumed-size array. Testing - Updated LIT test - check-all - OpenMP_VV (formerly sollve) test case tests/6.0/target/test_target_assumed_array_size.c
2025-07-23[OpenMP 6.0] Allow only byref arguments with `need_device_addr` modifier on ↵Fazlay Rabbi1-0/+17
`adjust_args` clause (#149586) If the need_device_addr adjust-op modifier is present, each list item that appears in the clause must refer to an argument in the declaration of the function variant that has a reference type. Reference: OpenMP 6.0 [Sec 9.6.2, page 332, line 31-33, adjust_args clause, Restrictions]
2025-07-11[OpenMP][clang] 6.0: parsing/sema for message/severity for parallel (#146093)Robert Imschweiler1-2/+2
Implement parsing and semantic analysis support for the message and severity clauses that have been added to the parallel directive in OpenMP 6.0, 12.1.
2025-06-24[OpenMP][clang] 6.0: parsing/sema for num_threads 'strict' modifier (#145490)Robert Imschweiler1-30/+46
Implement parsing and semantic analysis support for the optional 'strict' modifier of the num_threads clause. This modifier has been introduced in OpenMP 6.0, section 12.1.2. Note: this is basically 1:1 https://reviews.llvm.org/D138328.
2025-06-18[Clang][OpenMP][LoopTransformations] Fix incorrect number of generated loops ↵Walter J.T.V1-2/+2
for Tile and Reverse directives (#140532) This patch is closely related to #139293 and addresses an existing issue in the loop transformation codebase. Specifically, it corrects the handling of the `NumGeneratedLoops` variable in `OMPLoopTransformationDirective` AST nodes and its inheritors (such as OMPUnrollDirective, OMPTileDirective, etc.). Previously, this variable was inaccurately set for certain transformations like reverse or tile. While this did not lead to functional bugs, since the value was only checked to determine whether it was greater than zero or equal to zero, the inconsistency could introduce problems when supporting more complex directives in the future.
2025-06-11[OpenMP 60] Initial parsing/sema for `need_device_addr` modifier on ↵Fazlay Rabbi1-0/+5
`adjust_args` clause (#143442) Adds initial parsing and semantic analysis for `need_device_addr` modifier on `adjust_args` clause.
2025-06-11[Clang][OpenMP] Fix mapping of arrays of structs with members with mappers ↵Abhinav Gaba1-12/+26
(#142511) This builds upon #101101 from @jyu2-git, which used compiler-generated mappers when mapping an array-section of structs with members that have user-defined default mappers. Now we do the same when mapping arrays of structs.
2025-06-11[OpenMP 6.0 ]Codegen for Reduction over private variables with reduction ↵CHANDRA GHALE1-22/+19
clause (#134709) Codegen support for reduction over private variable with reduction clause. Section 7.6.10 in in OpenMP 6.0 spec. - An internal shared copy is initialized with an initializer value. - The shared copy is updated by combining its value with the values from the private copies created by the clause. - Once an encountering thread verifies that all updates are complete, its original list item is updated by merging its value with that of the shared copy and then broadcast to all threads. Sample Test Case from OpenMP 6.0 Example ``` #include <assert.h> #include <omp.h> #define N 10 void do_red(int n, int *v, int &sum_v) { sum_v = 0; // sum_v is private #pragma omp for reduction(original(private),+: sum_v) for (int i = 0; i < n; i++) { sum_v += v[i]; } } int main(void) { int v[N]; for (int i = 0; i < N; i++) v[i] = i; #pragma omp parallel num_threads(4) { int s_v; // s_v is private do_red(N, v, s_v); assert(s_v == 45); } return 0; } ``` Expected Codegen: ``` // A shared global/static variable is introduced for the reduction result. // This variable is initialized (e.g., using memset or a UDR initializer) // e.g., .omp.reduction.internal_private_var // Barrier before any thread performs combination call void @__kmpc_barrier(...) // Initialization block (executed by thread 0) // e.g., call void @llvm.memset.p0.i64(...) or call @udr_initializer(...) call void @__kmpc_critical(...) // Inside critical section: // Load the current value from the shared variable // Load the thread-local private variable's value // Perform the reduction operation // Store the result back to the shared variable call void @__kmpc_end_critical(...) // Barrier after all threads complete their combinations call void @__kmpc_barrier(...) // Broadcast phase: // Load the final result from the shared variable) // Store the final result to the original private variable in each thread // Final barrier after broadcast call void @__kmpc_barrier(...) ``` --------- Co-authored-by: Chandra Ghale <ghale@pe31.hpc.amslabs.hpecorp.net>
2025-06-06[Sema] Drop const from a return type (NFC) (#143224)Kazu Hirata1-1/+1
2025-05-28[OpenMP] Fix atomic compare handling with overloaded operators (#141142)Joseph Huber1-65/+97
Summary: When there are overloaded C++ operators in the global namespace the AST node for these is not a `BinaryExpr` but a `CXXOperatorCallExpr`. Modify the uses to handle this case, basically just treating it as a binary expression with two arguments. Fixes https://github.com/llvm/llvm-project/issues/141085
2025-05-13[OpenMP] Fix crash with invalid size expression (#139745)Aaron Ballman1-1/+4
We weren't correctly handling size expressions with errors before trying to get the type of the size expression. No release note needed because support for 'stripe' was added to the current release. Fixes #139433
2025-05-13[NFC] Use more isa and isa_and_nonnull instead dyn_cast for predicates (#137393)Max Graey1-1/+1
Also fix some typos in comments --------- Co-authored-by: Mehdi Amini <joker.eph@gmail.com>
2025-05-12[clang][OpenMP] Add error for large expr in collapse clause (#138592)Amr Hesham1-0/+7
Report error when OpenMP collapse clause has an expression that can't be represented in 64-bit Issue #138445
2025-05-12[OpenMP] Fix crash with invalid argument to simd collapse (#139313)Aaron Ballman1-0/+7
Same as with other recent crash fixes, this is checking whether the argument expression contains errors or not. Fixes #138493
2025-05-09[OpenMP] Fix a crash on invalid with unroll partial (#139280)Aaron Ballman1-1/+2
You cannot get the integer constant expression's value if the expression contains errors. Fixes https://github.com/llvm/llvm-project/issues/139267
2025-05-09[OpenMP] Fix crash when diagnosing dist_schedule (#139277)Aaron Ballman1-1/+2
We were failing to pass a required argument when emitting the diagnostic, so the source range was being used in place of an index. This caused a failed assertion due to the incorrect index. Fixes #139266
2025-05-09[clang][OpenMP] Pass OpenMP version to getOpenMPDirectiveName (#139115)Krzysztof Parzyszek1-65/+106
The OpenMP version is stored in language options in ASTContext. If the context is not available, use the fallback version. RFC: https://discourse.llvm.org/t/rfc-alternative-spellings-of-openmp-directives/85507
2025-05-09[OpenMP] No long crash on an invalid sizes argument (#139118)Aaron Ballman1-2/+12
We were trying to get type information out of an expression node which contained errors. That causes the type of the expression to be dependent, which the code was not expecting. Now we handle error conditions with an early return. Fixes #139073
2025-05-04[clang] Remove unused local variables (NFC) (#138453)Kazu Hirata1-5/+0
2025-05-02[OpenMP] Remove "alternativeName" from Clause and Directive classes (#138179)Krzysztof Parzyszek1-134/+155
The "alternativeName" was introduced ~5 years ago in D82405, and at the moment it has only one use, the one that the original change introduced. OpenMP 6.0 spec has introduced different spellings of some directives, but the "alternativeName" is not an adequate mechanism to implement it. For those reasons remove the "alternativeName" member from both Clause and Directive in DirectiveBase.td. Since the alternativeName text appeared in a number of clang OpenMP tests, implement `getOpenMPClauseNameForDiag` in SemaOpenMP.cpp to preserve the text of the diagnostics.
2025-05-02[clang][NFC] Convert `Sema::CorrectTypoKind` to scoped enumVlad Serebrennikov1-2/+2
2025-05-02[clang][NFC] Convert `Sema::AllowFoldKind` to scoped enumVlad Serebrennikov1-5/+6
2025-05-02[clang][NFC] Reland "Convert `Sema::TryCaptureKind` to scoped enum"Vlad Serebrennikov1-1/+1
2025-05-02Revert "[clang][NFC] Convert `Sema::TryCaptureKind` to scoped enum"Vlad Serebrennikov1-1/+1
This reverts commit be6497ff7583248d76a6710dd48cfeb63dd68f27.
2025-05-02[clang][NFC] Convert `Sema::TryCaptureKind` to scoped enumVlad Serebrennikov1-1/+1
2025-04-18[clang][OpenMP] Fix/enforce order-concurrent-nestable rules (#135463)Ernesto Su1-36/+21
OpenMP has restrictions on directives allowed to be strictly nested inside a construct with the order(concurrent) clause specified. - OpenMP 5.0, 5.1, and 5.2 allows: 'loop', 'parallel', 'simd', and combined directives starting with 'parallel'. - OpenMP 6.0 allows: the above directives plus 'atomic' and all loop-transformation directives. Furthermore, a region that corresponds to a construct with order(concurrent) specified may not contain calls to the OpenMP runtime API. This PR fixes the following issues in the current implementation: With -fopenmp-version=50: none of the nesting restrictions above were enforced With -fopenmp-version=60: 1. Clang did not reject OpenMP runtime APIs encountered in the region. 2. Clang erroneously rejected combined directives starting with parallel. --------- Co-authored-by: Zahira Ammarguellat <zahira.ammarguellat@intel.com>
2025-04-14[clang] AST: remove source locations from [Variable/Dependent]SizedArrayType ↵Matheus Izvekov1-2/+2
(#135511)
2025-03-21Reland: [clang] preserve class type sugar when taking pointer to member ↵Matheus Izvekov1-3/+2
(#132401) Original PR: #130537 Originally reverted due to revert of dependent commit. Relanding with no changes. This changes the MemberPointerType representation to use a NestedNameSpecifier instead of a Type to represent the base class. Since the qualifiers are always parsed as nested names, there was an impedance mismatch when converting these back and forth into types, and this led to issues in preserving sugar. The nested names are indeed a better match for these, as the differences which a QualType can represent cannot be expressed syntatically, and they represent the use case more exactly, being either dependent or referring to a CXXRecord, unqualified. This patch also makes the MemberPointerType able to represent sugar for a {up/downcast}cast conversion of the base class, although for now the underlying type is canonical, as preserving the sugar up to that point requires further work. As usual, includes a few drive-by fixes in order to make use of the improvements.
2025-03-21[OpenMP 6.0] Parse/Sema support for reduction over private variable with ↵CHANDRA GHALE1-9/+49
reduction clause. (#129938) Initial Parse/Sema support for reduction over private variable with reduction clause. Section 7.6.10 in in OpenMP 6.0 spec. - list item in a reduction clause can now be private in the enclosing context. - Added support for _original-sharing-modifier_ with reduction clause. --------- Co-authored-by: Chandra Ghale <ghale@pe31.hpc.amslabs.hpecorp.net>
2025-03-20Revert "Reland: [clang] preserve class type sugar when taking pointer to ↵Matheus Izvekov1-2/+3
member" (#132280) Reverts llvm/llvm-project#132234 Needs to be reverted due to dependency. This blocks reverting another PR, see here: https://github.com/llvm/llvm-project/pull/131965#issuecomment-2741619498
2025-03-20Reland: [clang] preserve class type sugar when taking pointer to member ↵Matheus Izvekov1-3/+2
(#132234) Original PR: #130537 Reland after updating lldb too. This changes the MemberPointerType representation to use a NestedNameSpecifier instead of a Type to represent the base class. Since the qualifiers are always parsed as nested names, there was an impedance mismatch when converting these back and forth into types, and this led to issues in preserving sugar. The nested names are indeed a better match for these, as the differences which a QualType can represent cannot be expressed syntatically, and they represent the use case more exactly, being either dependent or referring to a CXXRecord, unqualified. This patch also makes the MemberPointerType able to represent sugar for a {up/downcast}cast conversion of the base class, although for now the underlying type is canonical, as preserving the sugar up to that point requires further work. As usual, includes a few drive-by fixes in order to make use of the improvements.