================
@@ -11427,6 +11427,19 @@ static void AnalyzeImplicitConversions(
     return;
   }
 
+  if (auto *OutArgE = dyn_cast<HLSLOutArgExpr>(E)) {
+    // The base expression is only used to initialize the parameter for
+    // arguments to `inout` parameters, so we only traverse down the base
+    // expression for `inout` cases.
----------------
llvm-beanz wrote:

Gotcha! I think I misunderstood your comment since I didn't have the original 
lvalue preserved initially. I'll update this.

These are pretty wonky when we start looking at C++isms. My team reacted with 
disgust when I posed this potential (but currently invalid) code:

```hlsl
RWBuffer<int> Val;

struct A {
  int Idx;
  A &operator ++() {
    Val[Idx] = Val[Idx] + 1;
    return *this;
  }
};

void init(out A Obj) {
  Obj.Idx = 2;
};

[numthreads(1,1,1)]
void main() {
  A a;
  a.Idx = 0;
  init(++a);
  ++a;
}
```

We certainly need to evaluate the argument expression (so that it can 
side-effect). Constructors would make this more complicated, but it probably 
should default initialize. Are you okay with that being a follow-up? If so I'll 
file an issue to track doing that work.

https://github.com/llvm/llvm-project/pull/101083
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to