diff options
| author | Steven Perron <stevenperron@google.com> | 2025-09-09 10:39:30 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-09-09 10:39:30 -0400 |
| commit | f587e001b1d80e69c8dea24112e0daddcfbfa9b0 (patch) | |
| tree | 5045ebf0c4536ce65d7131c84167426dd571f127 /clang/lib/CodeGen/CGHLSLRuntime.cpp | |
| parent | 2bdcfc7ab86b5cc8b95474e9571c9477f5df4451 (diff) | |
[HLSL] Fix OpaqueValueExpr handling in InitListExpr (#156750)
The OpaqueValueVisitor was not correctly traversing the AST to find all
OpaqueValueExprs. This resulted in some expressions not being correctly
initialized. This change fixes the visitor to correctly traverse the
AST.
Fixes https://github.com/llvm/llvm-project/issues/156786
Diffstat (limited to 'clang/lib/CodeGen/CGHLSLRuntime.cpp')
| -rw-r--r-- | clang/lib/CodeGen/CGHLSLRuntime.cpp | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/clang/lib/CodeGen/CGHLSLRuntime.cpp b/clang/lib/CodeGen/CGHLSLRuntime.cpp index 60ad3eb75afe..0177733c83be 100644 --- a/clang/lib/CodeGen/CGHLSLRuntime.cpp +++ b/clang/lib/CodeGen/CGHLSLRuntime.cpp @@ -863,11 +863,27 @@ llvm::Instruction *CGHLSLRuntime::getConvergenceToken(BasicBlock &BB) { class OpaqueValueVisitor : public RecursiveASTVisitor<OpaqueValueVisitor> { public: - llvm::SmallPtrSet<OpaqueValueExpr *, 8> OVEs; + llvm::SmallVector<OpaqueValueExpr *, 8> OVEs; + llvm::SmallPtrSet<OpaqueValueExpr *, 8> Visited; OpaqueValueVisitor() {} + bool VisitHLSLOutArgExpr(HLSLOutArgExpr *) { + // These need to be bound in CodeGenFunction::EmitHLSLOutArgLValues + // or CodeGenFunction::EmitHLSLOutArgExpr. If they are part of this + // traversal, the temporary containing the copy out will not have + // been created yet. + return false; + } + bool VisitOpaqueValueExpr(OpaqueValueExpr *E) { - OVEs.insert(E); + // Traverse the source expression first. + if (E->getSourceExpr()) + TraverseStmt(E->getSourceExpr()); + + // Then add this OVE if we haven't seen it before. + if (Visited.insert(E).second) + OVEs.push_back(E); + return true; } }; |
