Skip to content

Commit

Permalink
[lldb] Don't crash when printing static enum members with bool as und…
Browse files Browse the repository at this point in the history
…erlying type

Undoes a lot of the code added in D135169 to piggyback off of the enum logic in `TypeSystemClang::SetIntegerInitializerForVariable()`.

Fixes #58383.

Reviewed By: DavidSpickett

Differential Revision: https://reviews.llvm.org/D137045
  • Loading branch information
aeubanks committed Nov 1, 2022
1 parent 0991da3 commit a715b1b
Show file tree
Hide file tree
Showing 8 changed files with 18 additions and 48 deletions.
2 changes: 0 additions & 2 deletions lldb/include/lldb/Symbol/CompilerType.h
Expand Up @@ -121,8 +121,6 @@ class CompilerType {

bool IsIntegerOrEnumerationType(bool &is_signed) const;

bool IsBooleanType() const;

bool IsPolymorphicClass() const;

/// \param target_type Can pass nullptr.
Expand Down
2 changes: 0 additions & 2 deletions lldb/include/lldb/Symbol/TypeSystem.h
Expand Up @@ -178,8 +178,6 @@ class TypeSystem : public PluginInterface {
return false;
}

virtual bool IsBooleanType(lldb::opaque_compiler_type_t type) = 0;

virtual bool IsScopedEnumerationType(lldb::opaque_compiler_type_t type) = 0;

virtual bool IsPossibleDynamicType(lldb::opaque_compiler_type_t type,
Expand Down
7 changes: 1 addition & 6 deletions lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
Expand Up @@ -2820,12 +2820,7 @@ void DWARFASTParserClang::ParseSingleMember(
return;
}

if (ct.IsBooleanType())
TypeSystemClang::SetBoolInitializerForVariable(
v, !const_value_or_err->isZero());
else
TypeSystemClang::SetIntegerInitializerForVariable(v,
*const_value_or_err);
TypeSystemClang::SetIntegerInitializerForVariable(v, *const_value_or_err);
}
return;
}
Expand Down
37 changes: 9 additions & 28 deletions lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
Expand Up @@ -3226,20 +3226,6 @@ bool TypeSystemClang::IsIntegerType(lldb::opaque_compiler_type_t type,
return false;
}

bool TypeSystemClang::IsBooleanType(lldb::opaque_compiler_type_t type) {
if (!type)
return false;

clang::QualType qual_type(GetCanonicalQualType(type));
const clang::BuiltinType *builtin_type =
llvm::dyn_cast<clang::BuiltinType>(qual_type->getCanonicalTypeInternal());

if (!builtin_type)
return false;

return builtin_type->isBooleanType();
}

bool TypeSystemClang::IsEnumerationType(lldb::opaque_compiler_type_t type,
bool &is_signed) {
if (type) {
Expand Down Expand Up @@ -7593,18 +7579,6 @@ clang::VarDecl *TypeSystemClang::AddVariableToRecordType(
return var_decl;
}

void TypeSystemClang::SetBoolInitializerForVariable(VarDecl *var, bool value) {
assert(!var->hasInit() && "variable already initialized");

QualType qt = var->getType();
assert(qt->isSpecificBuiltinType(BuiltinType::Bool) &&
"only boolean supported");

clang::ASTContext &ast = var->getASTContext();
var->setInit(CXXBoolLiteralExpr::Create(ast, value, qt.getUnqualifiedType(),
SourceLocation()));
}

void TypeSystemClang::SetIntegerInitializerForVariable(
VarDecl *var, const llvm::APInt &init_value) {
assert(!var->hasInit() && "variable already initialized");
Expand All @@ -7619,8 +7593,15 @@ void TypeSystemClang::SetIntegerInitializerForVariable(
const EnumDecl *enum_decl = enum_type->getDecl();
qt = enum_decl->getIntegerType();
}
var->setInit(IntegerLiteral::Create(ast, init_value, qt.getUnqualifiedType(),
SourceLocation()));
// Bools are handled separately because the clang AST printer handles bools
// separately from other integral types.
if (qt->isSpecificBuiltinType(BuiltinType::Bool)) {
var->setInit(CXXBoolLiteralExpr::Create(
ast, !init_value.isZero(), qt.getUnqualifiedType(), SourceLocation()));
} else {
var->setInit(IntegerLiteral::Create(
ast, init_value, qt.getUnqualifiedType(), SourceLocation()));
}
}

void TypeSystemClang::SetFloatingInitializerForVariable(
Expand Down
4 changes: 0 additions & 4 deletions lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h
Expand Up @@ -592,8 +592,6 @@ class TypeSystemClang : public TypeSystem {
bool IsEnumerationType(lldb::opaque_compiler_type_t type,
bool &is_signed) override;

bool IsBooleanType(lldb::opaque_compiler_type_t type) override;

bool IsScopedEnumerationType(lldb::opaque_compiler_type_t type) override;

static bool IsObjCClassType(const CompilerType &type);
Expand Down Expand Up @@ -863,8 +861,6 @@ class TypeSystemClang : public TypeSystem {
static void SetIntegerInitializerForVariable(clang::VarDecl *var,
const llvm::APInt &init_value);

static void SetBoolInitializerForVariable(clang::VarDecl *var, bool value);

/// Initializes a variable with a floating point value.
/// \param var The variable to initialize. Must not already have an
/// initializer and must have a floating point type.
Expand Down
6 changes: 0 additions & 6 deletions lldb/source/Symbol/CompilerType.cpp
Expand Up @@ -154,12 +154,6 @@ bool CompilerType::IsIntegerOrEnumerationType(bool &is_signed) const {
return IsIntegerType(is_signed) || IsEnumerationType(is_signed);
}

bool CompilerType::IsBooleanType() const {
if (IsValid())
return m_type_system->IsBooleanType(m_type);
return false;
}

bool CompilerType::IsPointerType(CompilerType *pointee_type) const {
if (IsValid()) {
return m_type_system->IsPointerType(m_type, pointee_type);
Expand Down
Expand Up @@ -57,6 +57,8 @@ def test(self):

# Test an unscoped enum.
self.expect_expr("A::enum_val", result_value="enum_case2")
# Test an unscoped enum with bool as the underlying type.
self.expect_expr("A::enum_bool_val", result_value="enum_bool_case2")

# Test a scoped enum.
self.expect_expr("A::scoped_enum_val", result_value="scoped_enum_case2")
Expand Down
6 changes: 6 additions & 0 deletions lldb/test/API/lang/cpp/const_static_integral_member/main.cpp
Expand Up @@ -5,6 +5,11 @@ enum Enum {
enum_case2 = 2,
};

enum EnumBool : bool {
enum_bool_case1 = false,
enum_bool_case2 = true,
};

enum class ScopedEnum {
scoped_enum_case1 = 1,
scoped_enum_case2 = 2,
Expand Down Expand Up @@ -51,6 +56,7 @@ struct A {
const static auto wchar_min = std::numeric_limits<wchar_t>::min();

const static Enum enum_val = enum_case2;
const static EnumBool enum_bool_val = enum_bool_case2;
const static ScopedEnum scoped_enum_val = ScopedEnum::scoped_enum_case2;
const static ScopedEnum not_enumerator_scoped_enum_val = static_cast<ScopedEnum>(5);
const static ScopedEnum not_enumerator_scoped_enum_val_2 =
Expand Down

0 comments on commit a715b1b

Please sign in to comment.