nickdesaulniers added inline comments.

================
Comment at: clang/lib/CodeGen/CGExprConstant.cpp:1131-1132
+    case CK_NullToPointer: {
+      if (llvm::Constant *C = Visit(subExpr, destType))
+        if (C->isNullValue())
+          return CGM.EmitNullConstant(destType);
----------------
efriedma wrote:
> nickdesaulniers wrote:
> > efriedma wrote:
> > > nickdesaulniers wrote:
> > > > FWIW, I would have thought these might be unnecessary, but we do trip 2 
> > > > tests without these guards IIRC.
> > > The fact that the Visit can fail doesn't surprise me; you can write 
> > > arbitrary expressions of type nullptr_t (for example, `nullptr_t f(); 
> > > void* g = f();`.  I can't think of any reason you'd need to check 
> > > C->isNullValue(), though; do you have a testcase for that?
> > Failed Tests (2):
> >   Clang :: CodeGenCXX/const-init-cxx11.cpp
> >   Clang :: CodeGenCXX/cxx11-thread-local-instantiated.cpp
> > 
> > Looking at the first:
> > 
> > ```
> > decltype(nullptr) null();
> > int *p = null();
> > ```
> > and the corresponding AST:
> > ```
> > |-FunctionDecl 0x5650ebbb44a8 <x.cpp:2:3, col:26> col:21 used null 
> > 'decltype(nullptr) ()'
> > `-VarDecl 0x5650ebbb45e0 <line:3:3, col:17> col:8 p 'int *' cinit
> >   `-ImplicitCastExpr 0x5650ebbb4740 <col:12, col:17> 'int *' <NullToPointer>
> >     `-CallExpr 0x5650ebbb4720 <col:12, col:17> 
> > 'decltype(nullptr)':'std::nullptr_t'
> >       `-ImplicitCastExpr 0x5650ebbb4708 <col:12> 'decltype(nullptr) (*)()' 
> > <FunctionToPointerDecay>
> >         `-DeclRefExpr 0x5650ebbb4690 <col:12> 'decltype(nullptr) ()' lvalue 
> > Function 0x5650ebbb44a8 'null' 'decltype(nullptr) ()'
> > ```
> > 
> > 
> > we change the existing test case from having a `__cxx_global_var_init` 
> > routine, i.e.:
> > ```
> > @p = dso_local global ptr null, align 8
> > @llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, 
> > ptr } { i32 65535, ptr @_GLOBAL__sub_I_x.cpp, ptr null }]
> > 
> > ; Function Attrs: noinline uwtable
> > define internal void @__cxx_global_var_init() #0 section ".text.startup" {
> > entry:
> >   %call = call ptr @_Z4nullv()
> >   store ptr null, ptr @p, align 8
> >   ret void
> > }
> > 
> > declare ptr @_Z4nullv() #1
> > 
> > ; Function Attrs: noinline uwtable
> > define internal void @_GLOBAL__sub_I_x.cpp() #0 section ".text.startup" {
> > entry:
> >   call void @__cxx_global_var_init()
> >   ret void
> > }
> > ```
> > to simply:
> > ```
> > @p = dso_local global ptr null, align 8
> > ```
> > So it seems nice to skip having the static constructors, but then 
> > `@_Z4nullv` is never invoked.  That seems problematic? (I expect the fast 
> > path to fail once it recurses down to the DeclRefExpr, but that requires 
> > the subexpr of the ImplicitCastExpr be visited).
> > 
> > ---
> > 
> > So I think the code as written is good to go. WDYT?
> I think you need to check that Visit() succeeds (returns a non-null 
> Constant*), but like I said before, I can't see why you need to check 
> `C->isNullValue()`
oh, sorry, my reading comprehension skills are sliding off a cliff.

Yeah, that's not necessary for test cases in tree. Removed.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D156175

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

Reply via email to