[PATCH] D90719: [DebugInfo] Modify ctor homing as workaround for unconstructed libcxx types

David Blaikie via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Nov 5 10:46:08 PST 2020


dblaikie added a comment.

In D90719#2376388 <https://reviews.llvm.org/D90719#2376388>, @rnk wrote:

> In D90719#2372656 <https://reviews.llvm.org/D90719#2372656>, @dblaikie wrote:
>
>> My understanding is that such code is UB, is that right?
>
> I guess I'm not convinced it's UB, and need some language lawyering help to decide.

Fair enough. The code we're talking about essentially boils down to this, right:

  struct non_trivially_constructible {
    non_trivially_constructible();
    int i;
  };
  struct implicitly_non_trivially_constructible : non_trivially_constructible {
  };
  void f1() {
    using T = implicitly_non_trivially_constructible;
    alignas(T) unsigned char data[sizeof(T)];
    T* t = static_cast<T*>(&data);
    t->i = 3;
    ...
  }

Yeah? My understanding is that the lifetime of the T object hasn't started, because its ctor hasn't been run. For trivial types that's a bit fuzzier (eg: `int *i = (int*)malloc(sizeof(int)); *i = 3;` - we don't usually bother to call the pseudodestructor on this type) but for a non-trivially constructible thing, I'd think that was pretty well required/guaranteed by the language? (sort of by definition of non-trivially constructible)


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D90719



More information about the cfe-commits mailing list