Skip to content

Commit 26c9626

Browse files
authored
Merge pull request #34365 from zoecarver/cxx/bool-enum
2 parents 3a1b9cd + 05faa07 commit 26c9626

File tree

4 files changed

+62
-5
lines changed

4 files changed

+62
-5
lines changed

lib/ClangImporter/ImportDecl.cpp

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8561,11 +8561,19 @@ ClangImporter::Implementation::createConstant(Identifier name, DeclContext *dc,
85618561
// Create the expression node.
85628562
StringRef printedValueCopy(context.AllocateCopy(printedValue));
85638563
if (value.getKind() == clang::APValue::Int) {
8564-
if (type->getCanonicalType()->isBool()) {
8565-
auto *boolExpr =
8566-
new (context) BooleanLiteralExpr(value.getInt().getBoolValue(),
8567-
SourceLoc(),
8568-
/**Implicit=*/true);
8564+
bool isBool = type->getCanonicalType()->isBool();
8565+
// Check if "type" is a C++ enum with an underlying type of "bool".
8566+
if (!isBool && type->getStructOrBoundGenericStruct() &&
8567+
type->getStructOrBoundGenericStruct()->getClangDecl()) {
8568+
if (auto enumDecl = dyn_cast<clang::EnumDecl>(
8569+
type->getStructOrBoundGenericStruct()->getClangDecl())) {
8570+
isBool = enumDecl->getIntegerType()->isBooleanType();
8571+
}
8572+
}
8573+
if (isBool) {
8574+
auto *boolExpr = new (context)
8575+
BooleanLiteralExpr(value.getInt().getBoolValue(), SourceLoc(),
8576+
/*Implicit=*/true);
85698577

85708578
boolExpr->setBuiltinInitializer(
85718579
context.getBoolBuiltinInitDecl());
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
enum Maybe : bool { No, Yes };
2+
enum BinaryNumbers : bool { One = 1, Zero = 0 };
3+
enum class EnumClass : bool { Foo, Bar };
4+
struct WrapperStruct {
5+
enum InnerBoolEnum : bool { A, B };
6+
};
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
module BoolEnums {
2+
header "bool-enums.h"
3+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// RUN: %target-swift-ide-test -print-module -module-to-print=BoolEnums -I %S/Inputs -source-filename=x -enable-cxx-interop | %FileCheck %s
2+
3+
// TODO: these should be enums eventually (especially the enum class).
4+
5+
// CHECK: struct Maybe : Equatable, RawRepresentable {
6+
// CHECK-NEXT: init(_ rawValue: Bool)
7+
// CHECK-NEXT: init(rawValue: Bool)
8+
// CHECK-NEXT: var rawValue: Bool
9+
// CHECK-NEXT: typealias RawValue = Bool
10+
// CHECK-NEXT: }
11+
12+
// CHECK: var No: Maybe { get }
13+
// CHECK: var Yes: Maybe { get }
14+
15+
// CHECK: struct BinaryNumbers : Equatable, RawRepresentable {
16+
// CHECK-NEXT: init(_ rawValue: Bool)
17+
// CHECK-NEXT: init(rawValue: Bool)
18+
// CHECK-NEXT: var rawValue: Bool
19+
// CHECK-NEXT: typealias RawValue = Bool
20+
// CHECK-NEXT: }
21+
22+
// CHECK: var One: BinaryNumbers { get }
23+
// CHECK: var Zero: BinaryNumbers { get }
24+
// CHECK: struct EnumClass : Equatable, RawRepresentable {
25+
// CHECK-NEXT: init(_ rawValue: Bool)
26+
// CHECK-NEXT: init(rawValue: Bool)
27+
// CHECK-NEXT: var rawValue: Bool
28+
// CHECK-NEXT: typealias RawValue = Bool
29+
// CHECK-NEXT: }
30+
31+
// CHECK: struct WrapperStruct {
32+
// TODO: where is "A" and "B"? They should be member variables.
33+
// CHECK-NEXT: struct InnerBoolEnum : Equatable, RawRepresentable {
34+
// CHECK-NEXT: init(_ rawValue: Bool)
35+
// CHECK-NEXT: init(rawValue: Bool)
36+
// CHECK-NEXT: var rawValue: Bool
37+
// CHECK-NEXT: typealias RawValue = Bool
38+
// CHECK-NEXT: }
39+
// CHECK-NEXT: init()
40+
// CHECK-NEXT: }

0 commit comments

Comments
 (0)