[PATCH] D131858: [clang] Track the templated entity in type substitution.
David Rector via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Sep 27 04:43:42 PDT 2022
davrec added a comment.
In D131858#3817646 <https://reviews.llvm.org/D131858#3817646>, @mizvekov wrote:
> In D131858#3815057 <https://reviews.llvm.org/D131858#3815057>, @davrec wrote:
>
>>> So this patch at least puts that into consistency.
>>
>> Is there already an analogous breakage for classes then?
>
> I am not sure I follow the question, but I meant that classes were already deserealizing templates first, so no need to fix them.
Question was referring to @ChuanqiXu 's comment about this patch breaking modules for function importing, see his repro (which I haven't looked at closely). I was asking if this meant that classes were already broken in a similar way, since you said this patch brings them into consistency.
>> Given @mizvekov's approaching deadline and @ChuanqiXu's limited availability, I'm inclined to think if @mizvekov can hack together a reasonable fix for this breakage, leaving a more rigorous/general solution for later as @ChuanqiXu suggests he would like to pursue, that would be sufficient to land this. Does anyone disagree?
>
> Well I wouldn't say this fix is a hack any more than the whole code is, as it's already playing by the rules of the existing implementation.
>
> We already have to deal with objects being accessed before they are fully deserialized, this is part of the design of the current solution.
> The present patch just adds a, presumably new, case where the order is important.
>
> Any changes in order to have a more strict, atomic deserialization are out of scope here.
I think we misunderstand each other again, but are you saying the breakage found by @ChuanqiXu does not need to be fixed because it is out of scope? (If classes are already broken due to this issue, the argument might have some validity.)
I wouldn't feel comfortable accepting this without either a) a hack to fix the breakage or b) @ChuanqiXu saying it is okay. Maybe best to punt until @ChuanqiXu gets back from vacation in a couple weeks IIUC?
================
Comment at: clang/include/clang/AST/Type.h:5060
+ /// Gets the template parameter declaration that was substituted for.
+ const TemplateTypeParmDecl *getReplacedParameter() const;
+
----------------
mizvekov wrote:
> davrec wrote:
> > @sammccall , drafting you as a representative for downstream AST users, do you have any objection to changing this return type to a `TemplateTypeParmDecl` from a `TemplateTypeParmType`? IIUC the change is not strictly necessary but is more for convenience, correct me if I'm wrong @mizvekov. But I'm inclined to think STTPT is not much used downstream so the churn will be minimal/acceptable, am I wrong?
> I don't think this is strictly true.
>
> We don't need to store the type, as that would increase storage for no benefit. The type won't have more usable information than the associated parameter declaration. The type can support a canonical representation, which we don't need.
>
> We will store the template-like declaration + index, and simply access the parameter decl from there.
> Otherwise creating a type from that requires the ASTContext and would possibly involve allocation.
I see, so it is a necessary change, and anyone who really depends on this returning the TTPT will need to convert it via `Context.getTemplateTypeParmType(...)`. But any code written getReplacementParameter()->getDecl() would just lose the getDecl() and be fine. And since all the info is in decl most people will only need to do the latter. Given the necessity I think that's okay.
================
Comment at: clang/include/clang/Sema/Template.h:80
+ struct ArgumentListLevel {
+ Decl *AssociatedDecl;
+ ArgList Args;
----------------
mizvekov wrote:
> davrec wrote:
> > Actually I think this one should be changed back to `ReplacedDecl` :)
> > ReplacedDecl makes perfect sense in MLTAL, AssociatedDecl seems to make better sense in STTPT.
> I would be against introducing another term to refer to the same thing...
The reason we need this unfortunately vague term "AssociatedDecl" in STTPT is because it can either be a template/template-like declaration *or* a TemplateTypeParmDecl. But here in MLTAL, it won't be a TTPD, will it? It will always be the parent template/template-like declaration, right? So there is no need for vagueness. `ReplacedDecl` or `ParentTemplate` or something like that seems more appropriate.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D131858/new/
https://reviews.llvm.org/D131858
More information about the cfe-commits
mailing list