akhuang added a subscriber: rsmith.
akhuang added inline comments.

================
Comment at: clang/lib/CodeGen/CGDebugInfo.cpp:1421-1425
+  else if (auto *TemplateDecl = Var->getInstantiatedFromStaticDataMember()) {
+    // Inline static data members might not have an initialization.
+    if (TemplateDecl->getInit())
+      Value = TemplateDecl->evaluateValue();
+  }
----------------
dblaikie wrote:
> I'd suspect this might not be the most general solution - because it's 
> retrieving the value from the original template static member. Two issues 
> come to mind:
> 1) If the initialization is dependent or otherwise not knowable at 
> compile-time, does this code at least not crash (I assume "evaluateValue" 
> returns nullptr if the value can't be evaluated for whatever reason)
> 2) If the initialization is dependent, it might still be knowable, eg:
> 
> ```
> template<typename T>
> struct static_decl_templ {
>   static constexpr int static_constexpr_decl_templ_var = sizeof(T);
> };
> ```
> 
> I'm guessing this patch as-is doesn't provide a value in this case, but it 
> should be achievable, I would guess/hope/imagine - but don't really know 
> exactly how to do that off-hand. (@zygoloid would know - but maybe a bit of 
> looking around will find it if/before he has a chance to weigh in here)
> 
> 
@rsmith 

Actually, can we just instantiate the initializer for static constexpr data 
members? 

currently 
[[https://github.com/llvm/llvm-project/blob/683b308c07bf827255fe1403056413f790e03729/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp#L5062|
 it delays creating the initializer for inline static data members ]]; can we 
not do that if it's a constexpr?


================
Comment at: clang/test/CodeGenCXX/debug-info-static-member.cpp:140-144
+#if __cplusplus >= 201103L
+  static constexpr int static_constexpr_decl_templ_var = 8;
+#else
+  static const int static_constexpr_decl_templ_var = 8;
+#endif
----------------
dblaikie wrote:
> I guess the non-11 version of this variable is intended as a stub to make the 
> test across different language levels simpler?
> 
> I think it might be better to make that more explicit - rather than having a 
> variable with "constexpr" in the name that isn't actually constexpr. I'd say 
> only add the variable under that macro condition - but change the test to use 
> multiple --check-prefixes, and the check for this variable to use a CPP11 
> prefix or something like that.
> 
> Hmm, I'm slightly confused now that I Think about it - it looks like the 
> macro is about testing if the version is >= 11. But the change also adds a 
> test for C++17? Is C++17 likely to be any different than C++11 for any of 
> this? (or C++20 for that matter) if it's not any different, I'd probably 
> leave the 17 case out & expect the 11 case is sufficient coverage.
Yeah, it was intended as a stub, but I can remove that part.

I added c++17 because it appears that in c++17 (and for MS targets) we make 
constexpr data members implicitly inline, which is why the initializer is not 
being instantiated.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D89286

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

Reply via email to