rsmith added inline comments.

================
Comment at: clang/include/clang/AST/TemplateBase.h:421
 
-public:
-  constexpr TemplateArgumentLocInfo() : Template({nullptr, nullptr, 0, 0}) {}
-
-  TemplateArgumentLocInfo(TypeSourceInfo *TInfo) : Declarator(TInfo) {}
+  T *getTemplate() const {
+    assert(Pointer.is<T *>());
----------------
If you're going to add more uses of the name `T`, we should rename it to 
something more descriptive. Maybe `TemplateTemplateArgLocInfo` or something 
like that?


================
Comment at: clang/include/clang/AST/TemplateBase.h:435-441
+    T *Template = new (Ctx) T;
+    Template->Qualifier = QualifierLoc.getNestedNameSpecifier();
+    Template->QualifierLocData = QualifierLoc.getOpaqueData();
+    Template->TemplateNameLoc = TemplateNameLoc.getRawEncoding();
+    Template->EllipsisLoc = EllipsisLoc.getRawEncoding();
+    Pointer = Template;
   }
----------------
I think this is just about complex enough to be worth moving to the .cpp file.


================
Comment at: clang/include/clang/AST/TemplateBase.h:444
   TypeSourceInfo *getAsTypeSourceInfo() const {
-    return Declarator;
+    assert(Pointer.is<TypeSourceInfo *>());
+    return Pointer.get<TypeSourceInfo *>();
----------------
This is redundant (here and below): `get` does this assert for you.


================
Comment at: clang/include/clang/AST/TemplateBase.h:43
+// the dependency.
+template <> struct PointerLikeTypeTraits<clang::Expr *> {
+  static inline void *getAsVoidPointer(clang::Expr *P) { return P; }
----------------
hokein wrote:
> sammccall wrote:
> > At first glance this is unsafe: you could have two different definitions of 
> > the same specialization in different files.
> > 
> > In fact it's OK, the default one can now never be instantiated, because 
> > Expr.h includes this file and so anyone that can see the definition can see 
> > this specialization.
> > 
> > But this is subtle/fragile: at least it needs to be spelled out explicitly 
> > in the comment.
> > I'd also suggest adding a static assert below the definition of Expr that 
> > it is compatible with this specialization (because it is sufficiently 
> > aligned).
> > 
> > (I can't think of a better alternative - use of PointerUnion is a win, 
> > partly *because* it validates the alignment)
> yes, exactly. 
> 
> do you have a better idea on how the static_assert should look like? The way 
> I can think of is to add a new flag in this specialization, and use 
> `static_assert(PointerLikeTypeTraits<clang::Expr *>::flag, "...")`.
This may be included from `Expr.h` right now, but really doesn't seem like the 
right header to hold this specialization. Perhaps we should consider adding 
something like an `AST/ForwardDecls.h`, containing forward declarations and 
specializations such as this one, and include that from `Expr.h` and from here?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D87080

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

Reply via email to