[PATCH] D90397: [clangd] Value initialize SymbolIDs

Sam McCall via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Sat Oct 31 18:12:06 PDT 2020


sammccall accepted this revision.
sammccall added a comment.
This revision is now accepted and ready to land.

In D90397#2366727 <https://reviews.llvm.org/D90397#2366727>, @nridge wrote:

> Would it have been possible to disallow default-constructing `SymbolID` altogether, and preserve the ability to represent "an always-valid symbol id" (`SymbolID`) vs. "a maybe-valid symbol id" (`Optional<SymbolID>`) as distinct types in the type system?

Absolutely, except where it matters`sizeof(SymbolID)==8` and `sizeof(Optional<SymbolID>)==16`.
I think the trigger here was `SymbolID Ref::Container` - we can't afford to use `Optional` there.
We could come up with some special-case solution for that and use Optional elsewhere - I don't really feel strongly about it.



================
Comment at: clang-tools-extra/clangd/AST.h:67
 
 /// Gets the symbol ID for a declaration, if possible.
+SymbolID getSymbolID(const Decl *D);
----------------
probably want to be a bit more specific about the possibility of returning null (and below)


================
Comment at: clang-tools-extra/clangd/index/SymbolID.h:57
 
+  bool isNull() const { return HashValue != std::array<uint8_t, RawSize>{}; }
+  operator bool() const { return isNull(); }
----------------
just `return *this == SymbolID()`?


================
Comment at: clang-tools-extra/clangd/index/SymbolID.h:58
+  bool isNull() const { return HashValue != std::array<uint8_t, RawSize>{}; }
+  operator bool() const { return isNull(); }
+
----------------
nit: I think you want this to be explicit. Note that if(x) **will** perform an explicit cast if needed


================
Comment at: clang-tools-extra/clangd/index/SymbolID.h:58
+  bool isNull() const { return HashValue != std::array<uint8_t, RawSize>{}; }
+  operator bool() const { return isNull(); }
+
----------------
sammccall wrote:
> nit: I think you want this to be explicit. Note that if(x) **will** perform an explicit cast if needed
this should be `!isNull()`!


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D90397



More information about the cfe-commits mailing list