hokein added inline comments.

================
Comment at: clang/lib/AST/Type.cpp:3429
            toTypeDependence(E->getDependence()) |
-               (E->isInstantiationDependent() ? TypeDependence::Dependent
-                                              : TypeDependence::None) |
+               (E->isTypeDependent() ? TypeDependence::Dependent
+                                     : TypeDependence::None) |
----------------
sammccall wrote:
> isn't this redudant with toDependence(E->getDependence)?
I think I must have missed to reset the dependent bit from the result of 
`toTypeDependence`. `toTypeDependence` will set the dependent bit if `E` is 
value-dependent, but it is wrong for `decltype`.


================
Comment at: clang/test/CodeGenCXX/mangle.cpp:805
 
-  // CHECK-LABEL: define weak_odr void 
@_ZN6test341fIiEEvDTstDTplcvT__EcvS1__EEE
+  // CHECK-LABEL: define weak_odr void @_ZN6test341fIiEEvm
   template void f<int>(decltype(sizeof(1)));
----------------
rsmith wrote:
> rsmith wrote:
> > sammccall wrote:
> > > sammccall wrote:
> > > > GCC mangles this as `_ZN6test341fIiEEvDTstDTplcvT__EcvS1__EEE`, so 
> > > > we're breaking compat here :-\
> > > > 
> > > > And in fact we're just incorrect. 
> > > > https://itanium-cxx-abi.github.io/cxx-abi/abi.html#mangling:
> > > > 
> > > > > If the operand expression of decltype is not instantiation-dependent 
> > > > > then the resulting type is encoded directly.
> > > > 
> > > > Here, instantiation-dependent *is* explicitly defined as 
> > > > "type-dependent or value-dependent or ...". And therefore these cases 
> > > > must not be "encoded directly", including the motivating case 
> > > > (decltype(N) where N is a typed constant whose initializer is 
> > > > value-dependent).
> > > > 
> > > > We could consider not two but *three* types of decltypetypes:
> > > >  - decltype(type-dependent), which is sugar for a canonical 
> > > > DependentDeclTypeType
> > > >  - decltype(instantiation-but-not-type-dependent), which is still sugar 
> > > > for a concrete canonical type (per C++17) but mangles using the expr 
> > > > (per cxxabi)
> > > >  - decltype(non-dependent), which is sugar for a concrete canonical 
> > > > type and mangles directly
> > > > 
> > > > This only works if it's OK for mangling to depend on non-canonical type 
> > > > details - I don't know whether this is the case. @rsmith - any hints 
> > > > here?
> > > Hmm, my naive reading of the mangle code matches what I described.
> > > 
> > > The big comment in ItaniumMangle talks about related issues: 
> > > https://github.com/llvm/llvm-project/blob/24238f09edb98b0f460aa41139874ae5d4e5cd8d/clang/lib/AST/ItaniumMangle.cpp#L2541-L2572
> > > 
> > > I don't really understand what's going on here, sorry.
> > Looks like we need the single-step-desugaring loop below the big comment 
> > you quoted to stop when it hits a `decltype` type. That's presumably where 
> > we step from the instantiation-dependent-but-not-type-dependent `decltype` 
> > node to its desugared type.
> Also... the FIXME from that comment will apply here too. Given:
> ```
> template<typename T> void f(decltype(sizeof(T)), decltype(sizeof(T))) {}
> template void f<int>(unsigned long, unsigned long);
> ```
> we currently (correctly, as far as I can see) use a substitution for the 
> second parameter type, but with the change here, I don't think we will do so 
> any more. We could fix that by deduplicating `DecltypeType`s when they're 
> instantiation dependent but not dependent; that's what we do for 
> `ConstantArrayType`'s size expression, for example. If we do that, we'll need 
> to store the actual expression on the `DecltypeTypeLoc`, since we can't rely 
> on the `DecltypeType` having the right expression any more (only an 
> expression that's equivalent to it).
Thanks for the hints and explanations.

> we currently (correctly, as far as I can see) use a substitution for the 
> second parameter type, but with the change here, I don't think we will do so 
> any more.

thanks for the example, yeah, the behavior was changed with the prior change of 
this patch. 

> We could fix that by deduplicating DecltypeTypes when they're instantiation 
> dependent but not dependent; that's what we do for ConstantArrayType's size 
> expression, for example. If we do that, we'll need to store the actual 
> expression on the DecltypeTypeLoc, since we can't rely on the DecltypeType 
> having the right expression any more (only an expression that's equivalent to 
> it).

It took me sometime to understand the whole piece here, but I'm afraid that I 
still don't fully understand the second part -- any reason why we can't rely on 
the underlying expression of DecltypeType when doing the deduplication? If we 
store the actual expression on `DecltypeTypeLoc`, how do we retrieve it in 
`ASTContext::getDecltypeType()`, I didn't find any connection between 
`DecltypeTypeLoc` and `ASTContext::getDecltypeType`.

I updated the patch using the `DecltypeTypeLoc` to do the duplication, it 
passes the example you gave above, but it might be wrong. 



Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D87349

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

Reply via email to