tgs-sc wrote:

> Hmm yea guarding against incorrect DWARF has been mostly best effort. Can you 
> provide a test-case for this?

Sure. Originally this bug was discovered by debugging llc, but I minimized it 
to such example:

--- b1.cc ---
```
#include <optional>
#include <iostream>

struct Type {
  Type() {
    printf("ctor\n");
  }

  Type(const Type& T) {
    printf("ctor copy\n");
  }

  Type(Type&& ) {
    printf("ctor move\n");
  }

  ~Type() {
    printf("dtor");
  }
};

std::optional<Type> var{};
std::optional<Type>* x = &var;
```
--- b2.cc ---
```
#include <iostream>

struct Type {
  Type() {
    printf("ctor\n");
  }

  Type(const Type& T) {
    printf("ctor copy\n");
  }

  Type(Type&& ) {
    printf("ctor move\n");
  }

  ~Type() {
    printf("dtor");
  }
};

std::optional<Type> var{};
std::optional<Type>* x = &var;

root@coder-timurgolubovich-timur-work-20:~/rnd/reproduction# cat b2.cc
#include <iostream>

class Type;
namespace std{
template<typename T>
class optional;
}
extern std::optional<Type>* x;

int main() {
        std::cout << x << std::endl;
}
```
Compilation: `/usr/bin/g++ b1.cc b2.cc -g -O0 -std=c++17 -o b.out`. The version 
of g++ should be 9.4.0.
Running: `lldb b.out -o "b main" -o "r" -o "p x"`
The problem is going to happen in internals of std::optional 
(https://gcc.gnu.org/onlinedocs/gcc-12.3.0/libstdc++/api/a00152_source.html) as 
the have 2 specializations of `_Optional_payload` that have the same type and 
differ only with template parameters.

https://github.com/llvm/llvm-project/pull/154123
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to