aaron.ballman added a comment.

In D128012#3630680 <https://reviews.llvm.org/D128012#3630680>, @beanz wrote:

> @aaron.ballman, I just had a total brain-asleep moment, and pushed this 
> without realizing that I had feedback from you. Are you okay with me 
> addressing that most-commit or would you prefer a revert? Huge apologies...

No worries, it happens! Post-commit is fine by me; no need to have significant 
churn.



================
Comment at: clang/lib/Headers/hlsl/hlsl_basic_types.h:30
 #ifdef __HLSL_ENABLE_16_BIT
-typedef int16_t int16_t2 __attribute__((ext_vector_type(2)));
-typedef int16_t int16_t3 __attribute__((ext_vector_type(3)));
-typedef int16_t int16_t4 __attribute__((ext_vector_type(4)));
-typedef uint16_t uint16_t2 __attribute__((ext_vector_type(2)));
-typedef uint16_t uint16_t3 __attribute__((ext_vector_type(3)));
-typedef uint16_t uint16_t4 __attribute__((ext_vector_type(4)));
+typedef vector<int16_t, 2> int16_t2;
+typedef vector<int16_t, 3> int16_t3;
----------------
beanz wrote:
> aaron.ballman wrote:
> > Can you explain these changes in light of:
> > 
> > > The problem is that templates aren't supported before HLSL 2021, and type 
> > > aliases still aren't supported in HLSL.
> > 
> > This still looks like it's using template and type aliases.
> This is an extreme total hack of insanity, but it is how HLSL works.
> 
> Basically, user-defined templates aren't supported, but built-in templates 
> have been around for years. In DXC, the `vector` template is a class 
> containing an ext_vector but there are horrible hacks in member expr handling 
> to make the `.` operator return ext_vector swizzles... Using an alias allows 
> me to get source compatibility here without having to do any of the member 
> expr hacking.
Interesting and horrifying in equal measures. :-)


================
Comment at: clang/lib/Sema/HLSLExternalSemaSource.cpp:41-44
+  auto *UsingDecl = UsingDirectiveDecl::Create(
+      AST, AST.getTranslationUnitDecl(), SourceLocation(), SourceLocation(),
+      NestedNameSpecifierLoc(), SourceLocation(), HLSLNamespace,
+      AST.getTranslationUnitDecl());
----------------
beanz wrote:
> aaron.ballman wrote:
> > And users won't find this behavior surprising? I would be worried that the 
> > user has their own globally declared type that this hidden using directive 
> > will then cause to be ambiguous: https://godbolt.org/z/jMsW54vWe -- when 
> > users hit this themselves, the location of the conflict is going to point 
> > into nowhere-land, which is also rather unfortunate.
> > 
> > Actually, the more I think about this, the less comfortable I am with it. 
> > This also means you have to be *very* careful about conflicts with STL 
> > names, and it means that any new declarations added to the `hlsl` namespace 
> > automatically risk breaking code.
> > 
> > Aside: any particular reason the namespace declaration is implicit but the 
> > using directive declaration is not?
> As HLSL is implanted today in DXC the built-in types and functions are all 
> globally defined (not in any namespace). My goal here was to start nesting 
> them in an `hlsl` namespace, and to eventually do that for DXC as well in a 
> new language version. HLSL just got support for `using namespace` like 3 
> months ago, so we can't do that in a header for compatibility, so my intent 
> was to throw it in the directive here. 
> 
> My hope is the next version of HLSL will move the builtins into the `hlsl` 
> namespace so I can make this only enabled for older language versions in the 
> near future.
> 
> In terms of conflicts with STL, I don't think the STL sources will compile 
> for HLSL anytime soon. Maybe in a future version of HLSL, but we've got a 
> long way to go to get there. For existing HLSL code, namespaces are very 
> sparingly used, and while we may find conflicts in user code I think moving 
> HLSL's builtins into a namespace will be worth the pain... but I might be 
> wrong about how much pain that will be.
So basically this trades redefinition errors for ambiguous lookup errors in 
terms of conflicts with user-declared code?

> In terms of conflicts with STL, I don't think the STL sources will compile 
> for HLSL anytime soon. Maybe in a future version of HLSL, but we've got a 
> long way to go to get there. For existing HLSL code, namespaces are very 
> sparingly used, and while we may find conflicts in user code I think moving 
> HLSL's builtins into a namespace will be worth the pain... but I might be 
> wrong about how much pain that will be.

I think moving them into a namespace is a lovely idea in theory, but it's still 
discomforting to add the `using` directive automatically for the user. The user 
is going to have the pain of dealing with the names moving to a new namespace 
at some point, so why not start from a cleaner design? It seems not entirely 
unreasonable to expect users to type `using namespace hlsl;` themselves if 
you're moving the types into a namespace, and users who need to handle older 
compilers can use the preprocessor to conditionally compile that line out. Or 
is that not really a viable option?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D128012

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to