Files
clang-p2996/lldb/test/Shell/SymbolFile/PDB/Inputs/AstRestoreTest.cpp
Aleksandr Urakov 895529cfd8 [lldb][PDB] Constexpr static member values as AST literals
Summary:
When evaluating an expression referencing a constexpr static member variable, an
error is issued because the PDB does not specify a symbol with an address that
can be relocated against.

Rather than attempt to resolve the variable's value within the IR execution, the
values of all constants can be looked up and incorporated into the AST of the
record type as a literal, mirroring the original compiler AST.

This change applies to DIA and native PDB loaders.

Patch By: jackoalan

Reviewers: aleksandr.urakov, jasonmolenda, zturner, jdoerfert, teemperor

Reviewed By: aleksandr.urakov

Subscribers: sstefan1, lldb-commits, llvm-commits, #lldb

Tags: #lldb, #llvm

Differential Revision: https://reviews.llvm.org/D82160
2020-06-25 11:27:16 +03:00

64 lines
1.3 KiB
C++

namespace N0 {
namespace N1 {
namespace {
enum Enum { Enum_0 = 1, Enum_1 = 2, Enum_2 = 4, Enum_3 = 8 };
enum class ScopedEnum { Enum_0 = 1, Enum_1 = 2, Enum_2 = 4, Enum_3 = 8 };
}
Enum Global = Enum_3;
struct Base {
Enum m_e = Enum_1;
};
class Class : public Base {
public:
Class(Enum e) : m_ce(e) {}
static int StaticFunc(const Class &c) {
return c.PrivateFunc(c.m_inner) + Global + ClassStatic;
}
const Enum m_ce;
static int ClassStatic;
static const int ClassStaticConst = 8;
static constexpr int ClassStaticConstexpr = 9;
static constexpr float ClassStaticConstexprFloat = 10.f;
static constexpr double ClassStaticConstexprDouble = 11.0;
static constexpr long double ClassStaticConstexprLongDouble = 12.0;
static const Enum ClassStaticConstEnum = Enum_3;
static const ScopedEnum ClassStaticConstScopedEnum = ScopedEnum::Enum_2;
private:
struct Inner {
char x;
short y;
int z;
};
int PrivateFunc(const Inner &i) const { return i.z; }
Inner m_inner{};
};
int Class::ClassStatic = 7;
template<typename T>
struct Template {
template<Enum E>
void TemplateFunc() {
T::StaticFunc(T(E));
}
};
void foo() { Template<Class>().TemplateFunc<Enum_0>(); }
} // namespace N1
} // namespace N0
int main() {
N0::N1::foo();
return 0;
}