[PATCH] D123167: [HLSL] Pointers are unsupported in HLSL

Aaron Ballman via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Apr 14 10:47:18 PDT 2022


aaron.ballman accepted this revision.
aaron.ballman added a comment.
This revision is now accepted and ready to land.

LGTM aside from the formatting nit.



================
Comment at: clang/lib/Sema/SemaExpr.cpp:15252-15257
+  if (getLangOpts().HLSL) {
+    if (Opc == UO_AddrOf)
+      return ExprError(Diag(OpLoc, diag::err_hlsl_operator_unsupported) << 0);
+    if (Opc == UO_Deref)
+      return ExprError(Diag(OpLoc, diag::err_hlsl_operator_unsupported) << 1);
+  }
----------------
beanz wrote:
> aaron.ballman wrote:
> > How should this interplay with overloaded operators on user-defined types? Is that case allowed so long as it doesn't form a pointer or a reference? (We should add test coverage for that.)
> So, the "correct" end goal is that we don't support overloading those operators. We have a few limitations on which operators we allow overloading for, generally any operators that in normal use return references or pointers, we don't allow you to overload.
> 
> That said, I wrote some test code to see where this falls over with my current change:
> 
> ```
> struct Fish {
>   struct Fins {
>     int Left;
>     int Right;
>   };
>   int X;
>   int operator *() {
>     return X;
>   }
> 
>   Fins operator ->() {
>     return Fins();
>   }
> };
> 
> int gone_fishing() {
>   Fish F;
>   int Result = *F;       // works... and is consistent with DXC
>   Result += F->Left; // error: member reference type 'Fish::Fins' is not a pointer
>   return Result;
> }
> ```
> 
> In the existing compiler we produce an error on definition of operators that aren't supported. I'd like to handle improving the diagnostics for those operators that way in a later patch if that is okay.
> 
> The `.*` and `.->` operators I couldn't get errors to actually trigger because I couldn't think of a way to write them that wasn't dependent on getting a member pointer, which errors and causes the remaining expression to not be checked.
> In the existing compiler we produce an error on definition of operators that aren't supported. I'd like to handle improving the diagnostics for those operators that way in a later patch if that is okay.

That's fine by me.


> The .* and .-> operators I couldn't get errors to actually trigger because I couldn't think of a way to write them that wasn't dependent on getting a member pointer, which errors and causes the remaining expression to not be checked.

Perfect, I couldn't find a way either, we can punt on that until we find a concrete issue.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D123167/new/

https://reviews.llvm.org/D123167



More information about the cfe-commits mailing list