aaron.ballman added a comment.

In D156453#4652939 <https://reviews.llvm.org/D156453#4652939>, @tbaeder wrote:

> It gets interpreted as a constant expression in 
> `Sema::CheckCompleteVariableInitialization()`:
>
>   * #0: Context.cpp:73  
> clang::interp::Context::evaluateAsInitializer(this=0x0000608000005d20, 
> Parent=0x00007fff6dc2a8d0, VD=0x0000621000073b48, Result=0x0000621000099e90)
>     #1: ExprConstant.cpp:15600  
> clang::Expr::EvaluateAsInitializer(this=0x0000621000099e40, 
> Value=0x0000621000099e90, Ctx=0x000062a000000200, VD=0x0000621000073b48, 
> Notes=0x00007fff6deac850, IsConstantInitialization=true) const
>     #2: Decl.cpp:2555  
> clang::VarDecl::evaluateValueImpl(this=0x0000621000073b48, 
> Notes=0x00007fff6deac850, IsConstantInitialization=true) const
>     #3: Decl.cpp:2626  
> clang::VarDecl::checkForConstantInitialization(this=0x0000621000073b48, 
> Notes=0x00007fff6deac850) const
>     #4: SemaDecl.cpp:14399  
> clang::Sema::CheckCompleteVariableDeclaration(this=0x000062900000a200, 
> var=0x0000621000073b48)

Ahh, we are doing this for static initialization cases with thread locals 
(https://godbolt.org/z/73dMx55xq), okay, that makes more sense now. Thank you!



================
Comment at: clang/lib/AST/Interp/ByteCodeExprGen.cpp:1213
   std::optional<PrimType> SubExprT = classify(SubExpr);
-  if (E->getStorageDuration() == SD_Static) {
+  bool IsStatic = E->getStorageDuration() == SD_Static;
+  if (GlobalDecl || IsStatic) {
----------------
Should we be looking at the TLS kind of the extended declaration? 
(`CheckCompleteVariableDeclaration()` is using `VarDecl::getTLSKind() == 
VarDecl::TLS_Static`)

Would something along these lines work instead?
```
bool EmitGlobalTemp = E->getStorageDuration() == SD_Static;
if (!EmitGlobalTemp) {
  if (const LifetimeExtendedTemporaryDecl *LETD = 
E->getLifetimeExtendedTemporaryDecl()) {
    if (const auto *VD = dyn_cast_if_present<VarDecl>(LETD->getExtendingDecl()) 
{
      EmitGlobalTemp= VD->getTLSKind() == VarDecl::TLS_Static;
    }
  }
}
```


================
Comment at: clang/test/AST/Interp/records.cpp:931
+  /// Not constexpr!
+  O o1(0);
 }
----------------
It'd be nice to add another test for:
```
constinit O o2(0); // error: can't bind to temporary
```


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D156453

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

Reply via email to