Skip to content

Commit 4cf6019

Browse files
add AddTypeQualifier & refactor
1 parent e175719 commit 4cf6019

File tree

3 files changed

+89
-51
lines changed

3 files changed

+89
-51
lines changed

include/clang/Interpreter/CppInterOp.h

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -88,12 +88,18 @@ namespace Cpp {
8888

8989
enum OperatorArity { kUnary = 1, kBinary, kBoth };
9090

91-
enum Qualifier : unsigned {
92-
Const = 0b01,
93-
Volatile = 0b010,
94-
Restrict = 0b0100
91+
/// Enum modelling CVR qualifiers.
92+
enum QualKind : unsigned char {
93+
Const = 1 << 0,
94+
Volatile = 1 << 1,
95+
Restrict = 1 << 2
9596
};
9697

98+
inline QualKind operator|(QualKind a, QualKind b) {
99+
return static_cast<QualKind>(static_cast<unsigned char>(a) |
100+
static_cast<unsigned char>(b));
101+
}
102+
97103
/// A class modeling function calls for functions produced by the interpreter
98104
/// in compiled code. It provides an information if we are calling a standard
99105
/// function, constructor or destructor.
@@ -260,12 +266,16 @@ namespace Cpp {
260266
CPPINTEROP_API bool IsEnumType(TCppType_t type);
261267

262268
/// Checks if the passed type has qual Qualifiers
263-
/// qual can be ORed value of enum Qualifier
264-
CPPINTEROP_API bool HasTypeQualifier(TCppType_t type, unsigned qual);
269+
/// qual can be ORed value of enum QualKind
270+
CPPINTEROP_API bool HasTypeQualifier(TCppType_t type, QualKind qual);
271+
272+
/// Returns type with the qual Qualifiers removed
273+
/// qual can be ORed value of enum QualKind
274+
CPPINTEROP_API TCppType_t RemoveTypeQualifier(TCppType_t type, QualKind qual);
265275

266-
/// Returns type with the qual Qualifiers
267-
/// qual can be ORed value of enum Qualifier
268-
CPPINTEROP_API TCppType_t RemoveTypeQualifier(TCppType_t type, unsigned qual);
276+
/// Returns type with the qual Qualifiers added
277+
/// qual can be ORed value of enum QualKind
278+
CPPINTEROP_API TCppType_t AddTypeQualifier(TCppType_t type, QualKind qual);
269279

270280
/// Extracts enum declarations from a specified scope and stores them in
271281
/// vector

lib/Interpreter/CppInterOp.cpp

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1657,40 +1657,60 @@ namespace Cpp {
16571657
return QT.getCanonicalType().getAsOpaquePtr();
16581658
}
16591659

1660-
bool HasTypeQualifier(TCppType_t type, unsigned qual) {
1660+
bool HasTypeQualifier(TCppType_t type, QualKind qual) {
16611661
if (!type)
16621662
return false;
16631663

16641664
QualType QT = QualType::getFromOpaquePtr(type);
1665-
if (qual & Qualifier::Const) {
1665+
if (qual & QualKind::Const) {
16661666
if (!QT.isConstQualified())
16671667
return false;
16681668
}
1669-
if (qual & Qualifier::Volatile) {
1669+
if (qual & QualKind::Volatile) {
16701670
if (!QT.isVolatileQualified())
16711671
return false;
16721672
}
1673-
if (qual & Qualifier::Restrict) {
1673+
if (qual & QualKind::Restrict) {
16741674
if (!QT.isRestrictQualified())
16751675
return false;
16761676
}
16771677
return true;
16781678
}
16791679

1680-
TCppType_t RemoveTypeQualifier(TCppType_t type, unsigned qual) {
1680+
TCppType_t RemoveTypeQualifier(TCppType_t type, QualKind qual) {
16811681
if (!type)
16821682
return type;
16831683

16841684
auto QT = QualType(QualType::getFromOpaquePtr(type));
1685-
if (qual & Qualifier::Const)
1685+
if (qual & QualKind::Const)
16861686
QT.removeLocalConst();
1687-
if (qual & Qualifier::Volatile)
1687+
if (qual & QualKind::Volatile)
16881688
QT.removeLocalVolatile();
1689-
if (qual & Qualifier::Restrict)
1689+
if (qual & QualKind::Restrict)
16901690
QT.removeLocalRestrict();
16911691
return QT.getAsOpaquePtr();
16921692
}
16931693

1694+
TCppType_t AddTypeQualifier(TCppType_t type, QualKind qual) {
1695+
if (!type)
1696+
return type;
1697+
1698+
auto QT = QualType(QualType::getFromOpaquePtr(type));
1699+
if (qual & QualKind::Const) {
1700+
if (!QT.isConstQualified())
1701+
QT.addConst();
1702+
}
1703+
if (qual & QualKind::Volatile) {
1704+
if (!QT.isVolatileQualified())
1705+
QT.addVolatile();
1706+
}
1707+
if (qual & QualKind::Restrict) {
1708+
if (!QT.isRestrictQualified())
1709+
QT.addRestrict();
1710+
}
1711+
return QT.getAsOpaquePtr();
1712+
}
1713+
16941714
// Internal functions that are not needed outside the library are
16951715
// encompassed in an anonymous namespace as follows. This function converts
16961716
// from a string to the actual type. It is used in the GetType() function.

unittests/CppInterOp/TypeReflectionTest.cpp

Lines changed: 42 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -633,38 +633,46 @@ TEST(TypeReflectionTest, TypeQualifiers) {
633633
Cpp::TCppType_t g = Cpp::GetVariableType(Cpp::GetNamed("g"));
634634
Cpp::TCppType_t h = Cpp::GetVariableType(Cpp::GetNamed("h"));
635635

636-
EXPECT_FALSE(Cpp::HasTypeQualifier(nullptr, 0));
637-
EXPECT_FALSE(Cpp::RemoveTypeQualifier(nullptr, 0));
638-
639-
EXPECT_FALSE(Cpp::HasTypeQualifier(a, Cpp::Qualifier::Const));
640-
EXPECT_FALSE(Cpp::HasTypeQualifier(a, Cpp::Qualifier::Volatile));
641-
EXPECT_FALSE(Cpp::HasTypeQualifier(a, Cpp::Qualifier::Restrict));
642-
EXPECT_TRUE(Cpp::HasTypeQualifier(b, Cpp::Qualifier::Restrict));
643-
EXPECT_TRUE(Cpp::HasTypeQualifier(c, Cpp::Qualifier::Const));
644-
EXPECT_TRUE(Cpp::HasTypeQualifier(d, Cpp::Qualifier::Volatile));
645-
EXPECT_TRUE(Cpp::HasTypeQualifier(e, Cpp::Qualifier::Const |
646-
Cpp::Qualifier::Volatile));
647-
EXPECT_TRUE(Cpp::HasTypeQualifier(f, Cpp::Qualifier::Const |
648-
Cpp::Qualifier::Restrict));
649-
EXPECT_TRUE(Cpp::HasTypeQualifier(g, Cpp::Qualifier::Volatile |
650-
Cpp::Qualifier::Restrict));
651-
EXPECT_TRUE(Cpp::HasTypeQualifier(h, Cpp::Qualifier::Const |
652-
Cpp::Qualifier::Volatile |
653-
Cpp::Qualifier::Restrict));
654-
655-
EXPECT_EQ(a, Cpp::RemoveTypeQualifier(b, Cpp::Qualifier::Restrict));
656-
EXPECT_EQ(a, Cpp::RemoveTypeQualifier(c, Cpp::Qualifier::Const));
657-
EXPECT_EQ(a, Cpp::RemoveTypeQualifier(d, Cpp::Qualifier::Volatile));
658-
EXPECT_EQ(a, Cpp::RemoveTypeQualifier(e, Cpp::Qualifier::Const |
659-
Cpp::Qualifier::Volatile));
660-
EXPECT_EQ(a, Cpp::RemoveTypeQualifier(f, Cpp::Qualifier::Const |
661-
Cpp::Qualifier::Restrict));
662-
EXPECT_EQ(a, Cpp::RemoveTypeQualifier(g, Cpp::Qualifier::Volatile |
663-
Cpp::Qualifier::Restrict));
664-
EXPECT_EQ(a, Cpp::RemoveTypeQualifier(h, Cpp::Qualifier::Const |
665-
Cpp::Qualifier::Volatile |
666-
Cpp::Qualifier::Restrict));
667-
EXPECT_EQ(e, Cpp::RemoveTypeQualifier(h, Cpp::Qualifier::Restrict));
668-
EXPECT_EQ(b, Cpp::RemoveTypeQualifier(h, Cpp::Qualifier::Const |
669-
Cpp::Qualifier::Volatile));
636+
EXPECT_FALSE(Cpp::HasTypeQualifier(nullptr, Cpp::QualKind::Const));
637+
EXPECT_FALSE(Cpp::RemoveTypeQualifier(nullptr, Cpp::QualKind::Const));
638+
EXPECT_FALSE(Cpp::AddTypeQualifier(nullptr, Cpp::QualKind::Const));
639+
640+
EXPECT_FALSE(Cpp::HasTypeQualifier(a, Cpp::QualKind::Const));
641+
EXPECT_FALSE(Cpp::HasTypeQualifier(a, Cpp::QualKind::Volatile));
642+
EXPECT_FALSE(Cpp::HasTypeQualifier(a, Cpp::QualKind::Restrict));
643+
EXPECT_TRUE(Cpp::HasTypeQualifier(b, Cpp::QualKind::Restrict));
644+
EXPECT_TRUE(Cpp::HasTypeQualifier(c, Cpp::QualKind::Const));
645+
EXPECT_TRUE(Cpp::HasTypeQualifier(d, Cpp::QualKind::Volatile));
646+
EXPECT_TRUE(
647+
Cpp::HasTypeQualifier(e, Cpp::QualKind::Const | Cpp::QualKind::Volatile));
648+
EXPECT_TRUE(
649+
Cpp::HasTypeQualifier(f, Cpp::QualKind::Const | Cpp::QualKind::Restrict));
650+
EXPECT_TRUE(Cpp::HasTypeQualifier(g, Cpp::QualKind::Volatile |
651+
Cpp::QualKind::Restrict));
652+
EXPECT_TRUE(Cpp::HasTypeQualifier(h, Cpp::QualKind::Const |
653+
Cpp::QualKind::Volatile |
654+
Cpp::QualKind::Restrict));
655+
656+
EXPECT_EQ(a, Cpp::RemoveTypeQualifier(b, Cpp::QualKind::Restrict));
657+
EXPECT_EQ(a, Cpp::RemoveTypeQualifier(c, Cpp::QualKind::Const));
658+
EXPECT_EQ(a, Cpp::RemoveTypeQualifier(d, Cpp::QualKind::Volatile));
659+
EXPECT_EQ(a, Cpp::RemoveTypeQualifier(e, Cpp::QualKind::Const |
660+
Cpp::QualKind::Volatile));
661+
EXPECT_EQ(a, Cpp::RemoveTypeQualifier(f, Cpp::QualKind::Const |
662+
Cpp::QualKind::Restrict));
663+
EXPECT_EQ(a, Cpp::RemoveTypeQualifier(g, Cpp::QualKind::Volatile |
664+
Cpp::QualKind::Restrict));
665+
EXPECT_EQ(a, Cpp::RemoveTypeQualifier(h, Cpp::QualKind::Const |
666+
Cpp::QualKind::Volatile |
667+
Cpp::QualKind::Restrict));
668+
EXPECT_EQ(e, Cpp::RemoveTypeQualifier(h, Cpp::QualKind::Restrict));
669+
EXPECT_EQ(b, Cpp::RemoveTypeQualifier(h, Cpp::QualKind::Const |
670+
Cpp::QualKind::Volatile));
671+
672+
EXPECT_EQ(c, Cpp::AddTypeQualifier(a, Cpp::QualKind::Const));
673+
EXPECT_EQ(d, Cpp::AddTypeQualifier(a, Cpp::QualKind::Volatile));
674+
EXPECT_EQ(b, Cpp::AddTypeQualifier(a, Cpp::QualKind::Restrict));
675+
EXPECT_EQ(h, Cpp::AddTypeQualifier(a, Cpp::QualKind::Const |
676+
Cpp::QualKind::Volatile |
677+
Cpp::QualKind::Restrict));
670678
}

0 commit comments

Comments
 (0)