hvdijk marked 2 inline comments as done.
hvdijk added inline comments.

================
Comment at: clang/lib/AST/ItaniumMangle.cpp:6031
+bool CXXNameMangler::mangleSubstitution(NestedNameSpecifier *NNS) {
+  NNS = Context.getASTContext().getCanonicalNestedNameSpecifier(NNS);
+  return mangleSubstitution(reinterpret_cast<uintptr_t>(NNS));
----------------
rsmith wrote:
> This seems a little error-prone to me: calling this on a type NNS would do 
> the wrong thing (those are supposed to share a substitution number with the 
> type, rather than have a substitution of their own).
> 
> We could handle the various cases here and dispatch to the right forms of 
> `mangleSubstitution` depending on the kind of NNS, but that code would all be 
> unreachable / untested. So maybe we should just make this assert that 
> `NNS->getKind() == NestedNameSpecifier::Identifier`. (And optionally we could 
> give this a more specific name, eg `mangleSubstitutionForIdentifierNNS`?)
I have added the assert that you suggested. I would actually have preferred for 
this function to be used for other NNS substitutions as well to better align 
with how the spec says substitutions should be handled (it's a rule of 
`<prefix>`, not any component within) but that seemed like an unnecessarily 
more invasive change. If you are okay with it I would like to keep the function 
named just `mangleSubstitution` to keep that open as option for a possible 
future clean-up.


================
Comment at: clang/test/CodeGenCXX/clang-abi-compat.cpp:160
+template <typename T> void test10(typename T::Y::a, typename T::Y::b) {}
+// PRE15: @_Z6test10I1XEvNT_1Y1aENS1_1Y1bE
+// V15:   @_Z6test10I1XEvNT_1Y1aENS2_1bE
----------------
rsmith wrote:
> I think this test does not capture an important property for which we should 
> have test coverage: that we used to not register a substitution for `T::Y` 
> (not only that we used to not *use* a substitution for it). For example, this 
> test would capture that:
> 
> ```
> struct X {
>   struct Y {
>     using a = int;
>     using b = int;
>   };
> };
> template <typename T> void test10(typename T::Y::a, typename T::Y::b, float*, 
> float*) {}
> template void test10<X>(int, int, float*, float*);
> ```
> ... where the numbering of `float*` depends on how many substitutions we 
> created for the earlier types.
> 
> (Put another way, this test covers only one of the two `if (!Clang14Compat)` 
> tests in ItaniumMangle.cpp, and we should cover both.)
I get where you're coming from. My thinking was the other way around, if we add 
the first `if (!Clang14Compat && ...)` by itself that will have no effect and 
cannot be tested for, then if we add the second `if (!Clang14Compat)` that does 
have impact and needs testing. You're looking at it the other way around, if we 
add the second `if (!Clang14Compat)` first, we fix one bug, and if we then add 
the first `if (!Clang14Compat && ...)` we fix another. Happy to extend the test 
like you suggested.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D122663

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

Reply via email to