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
64 lines
1.3 KiB
C++
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;
|
|
}
|