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
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits