aaron.ballman added inline comments.

================
Comment at: clang/lib/AST/Interp/ByteCodeExprGen.cpp:803
+  // Make sure we don't accidentally register the same decl twice.
+  if (auto *VD = dyn_cast_if_present<ValueDecl>(Src.dyn_cast<const Decl *>())) 
{
+    assert(!P.getGlobal(VD));
----------------



================
Comment at: clang/lib/AST/Interp/ByteCodeExprGen.cpp:822
+  // Make sure we don't accidentally register the same decl twice.
+  if (auto *VD = dyn_cast_if_present<ValueDecl>(Src.dyn_cast<const Decl *>())) 
{
+    assert(!P.getGlobal(VD));
----------------



================
Comment at: clang/lib/AST/Interp/ByteCodeExprGen.cpp:1127
         return false;
-      if (!this->emitInitGlobal(*T, *I, VD))
+    }
+  } else {
----------------
and if we have no `GlobalIndex`?

Should this instead be:
```
if (auto GlobalIndex = P.getGlobal(VD); !GlobalIndex || 
!this->emitGetPtrGlobal(*GlobalIndex, VD))
  return false;
```



================
Comment at: clang/lib/AST/Interp/ByteCodeExprGen.cpp:1129-1131
+    if (auto It = Locals.find(VD); It != Locals.end()) {
+      if (!this->emitGetPtrLocal(It->second.Offset, VD))
         return false;
----------------
Similar question here as above -- what if `It == Locals.end()`?


================
Comment at: clang/lib/AST/Interp/ByteCodeExprGen.cpp:1161
+      if (VarT) {
+        if (!this->visit(Init))
           return false;
----------------
What if `Init` is `nullptr`?


================
Comment at: clang/lib/AST/Interp/ByteCodeExprGen.cpp:1165
       }
+      return this->visitGlobalInitializer(Init, *GlobalIndex);
+    }
----------------
Same here?


================
Comment at: clang/lib/AST/Interp/ByteCodeExprGen.h:96
   bool visitDecl(const VarDecl *VD) override;
+  bool visitVarDecl(const VarDecl *VD);
 
----------------
I was a bit surprised to not see `override` here -- I wonder if we should have 
some visual separation between the overrides and the non-overrides given the 
similarity in naming?


================
Comment at: clang/lib/AST/Interp/ByteCodeExprGen.h:282
+  bool isGlobalDecl(const VarDecl *VD) const {
+    return !VD->hasLocalStorage() || VD->isConstexpr();
+  }
----------------
tbaeder wrote:
> shafik wrote:
> > tbaeder wrote:
> > > shafik wrote:
> > > > tbaeder wrote:
> > > > > shafik wrote:
> > > > > > Why not `hasGlobalStorage()`?
> > > > > > 
> > > > > > Also what is the logic behind `isConstexpr()` check?
> > > > > Didn't know `isGlobalStorage()` existed ;)
> > > > > 
> > > > > Constexpr local variables can be handled like global ones, can't 
> > > > > they? That was the logic behind it, nothing else. We can save 
> > > > > ourselves the hassle of local variables in that case.
> > > > I think I am missing a level of logic here. I don't think of constant 
> > > > expressions as needing storage nor do I think of them as global 
> > > > variables.
> > > > 
> > > > So can you take a step back and explain how this fits in the bigger 
> > > > picture?
> > > They don't necessarily need storage in the final executable but we create 
> > > global/local variables for them for bookkeeping, e.g. we need to be able 
> > > to take their address, track the value, etc.
> > Ok, will this work for recursive `constexpr` functions with local variables?
> local `constexpr` variables still have to be initialized and are immutable, 
> so that doesn't make a difference for recursive functions since none of the 
> recursive calls can change the variable value. I did a small local test but 
> since the variable can't be modified, it's not very interesting.
I find the interface to be confusing. If I want to know "is this a global 
decl", I am not going to expect a local constexpr variable to go "oh yeah, I 
totally am!". Perhaps this should be renamed to something more about the 
semantics, like `shouldBeGloballyIndexed()` or something along those lines?


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

https://reviews.llvm.org/D136815

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

Reply via email to