[clang] c23aaa4 - [clang][NFC] Refactor `CharacterLiteral::CharacterKind`
Vlad Serebrennikov via cfe-commits
cfe-commits at lists.llvm.org
Sun Nov 5 02:36:15 PST 2023
Author: Vlad Serebrennikov
Date: 2023-11-05T13:36:08+03:00
New Revision: c23aaa410358b9f9c364ddaaeb6b2069b185a99b
URL: https://github.com/llvm/llvm-project/commit/c23aaa410358b9f9c364ddaaeb6b2069b185a99b
DIFF: https://github.com/llvm/llvm-project/commit/c23aaa410358b9f9c364ddaaeb6b2069b185a99b.diff
LOG: [clang][NFC] Refactor `CharacterLiteral::CharacterKind`
This patch converts `CharacterLiteral::CharacterKind` to scoped enum in namespace scope. This enables forward declaration of this enum, which is useful in case like annotating bit-fields with `preferred_type`.
Added:
Modified:
clang/include/clang/AST/Expr.h
clang/lib/AST/Expr.cpp
clang/lib/AST/StmtProfile.cpp
clang/lib/AST/TemplateBase.cpp
clang/lib/Edit/RewriteObjCFoundationAPI.cpp
clang/lib/Sema/SemaExpr.cpp
clang/lib/Sema/SemaExprObjC.cpp
clang/lib/Sema/SemaTemplate.cpp
clang/lib/Serialization/ASTReaderStmt.cpp
clang/lib/Serialization/ASTWriterStmt.cpp
Removed:
################################################################################
diff --git a/clang/include/clang/AST/Expr.h b/clang/include/clang/AST/Expr.h
index 1baaf06d96d86a3..7e8e183afc5d3cf 100644
--- a/clang/include/clang/AST/Expr.h
+++ b/clang/include/clang/AST/Expr.h
@@ -1620,26 +1620,18 @@ class FixedPointLiteral : public Expr, public APIntStorage {
}
};
-class CharacterLiteral : public Expr {
-public:
- enum CharacterKind {
- Ascii,
- Wide,
- UTF8,
- UTF16,
- UTF32
- };
+enum class CharacterLiteralKind { Ascii, Wide, UTF8, UTF16, UTF32 };
-private:
+class CharacterLiteral : public Expr {
unsigned Value;
SourceLocation Loc;
public:
// type should be IntTy
- CharacterLiteral(unsigned value, CharacterKind kind, QualType type,
+ CharacterLiteral(unsigned value, CharacterLiteralKind kind, QualType type,
SourceLocation l)
: Expr(CharacterLiteralClass, type, VK_PRValue, OK_Ordinary),
Value(value), Loc(l) {
- CharacterLiteralBits.Kind = kind;
+ CharacterLiteralBits.Kind = llvm::to_underlying(kind);
setDependence(ExprDependence::None);
}
@@ -1647,8 +1639,8 @@ class CharacterLiteral : public Expr {
CharacterLiteral(EmptyShell Empty) : Expr(CharacterLiteralClass, Empty) { }
SourceLocation getLocation() const { return Loc; }
- CharacterKind getKind() const {
- return static_cast<CharacterKind>(CharacterLiteralBits.Kind);
+ CharacterLiteralKind getKind() const {
+ return static_cast<CharacterLiteralKind>(CharacterLiteralBits.Kind);
}
SourceLocation getBeginLoc() const LLVM_READONLY { return Loc; }
@@ -1657,14 +1649,16 @@ class CharacterLiteral : public Expr {
unsigned getValue() const { return Value; }
void setLocation(SourceLocation Location) { Loc = Location; }
- void setKind(CharacterKind kind) { CharacterLiteralBits.Kind = kind; }
+ void setKind(CharacterLiteralKind kind) {
+ CharacterLiteralBits.Kind = llvm::to_underlying(kind);
+ }
void setValue(unsigned Val) { Value = Val; }
static bool classof(const Stmt *T) {
return T->getStmtClass() == CharacterLiteralClass;
}
- static void print(unsigned val, CharacterKind Kind, raw_ostream &OS);
+ static void print(unsigned val, CharacterLiteralKind Kind, raw_ostream &OS);
// Iterators
child_range children() {
diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp
index 15a64cc71b79fa3..eccff0699d21a2a 100644
--- a/clang/lib/AST/Expr.cpp
+++ b/clang/lib/AST/Expr.cpp
@@ -982,21 +982,21 @@ std::string FixedPointLiteral::getValueAsString(unsigned Radix) const {
return std::string(S.str());
}
-void CharacterLiteral::print(unsigned Val, CharacterKind Kind,
+void CharacterLiteral::print(unsigned Val, CharacterLiteralKind Kind,
raw_ostream &OS) {
switch (Kind) {
- case CharacterLiteral::Ascii:
+ case CharacterLiteralKind::Ascii:
break; // no prefix.
- case CharacterLiteral::Wide:
+ case CharacterLiteralKind::Wide:
OS << 'L';
break;
- case CharacterLiteral::UTF8:
+ case CharacterLiteralKind::UTF8:
OS << "u8";
break;
- case CharacterLiteral::UTF16:
+ case CharacterLiteralKind::UTF16:
OS << 'u';
break;
- case CharacterLiteral::UTF32:
+ case CharacterLiteralKind::UTF32:
OS << 'U';
break;
}
@@ -1009,7 +1009,7 @@ void CharacterLiteral::print(unsigned Val, CharacterKind Kind,
// would result in an invalid \U escape sequence.
// FIXME: multicharacter literals such as '\xFF\xFF\xFF\xFF'
// are not correctly handled.
- if ((Val & ~0xFFu) == ~0xFFu && Kind == CharacterLiteral::Ascii)
+ if ((Val & ~0xFFu) == ~0xFFu && Kind == CharacterLiteralKind::Ascii)
Val &= 0xFFu;
if (Val < 256 && isPrintable((unsigned char)Val))
OS << "'" << (char)Val << "'";
diff --git a/clang/lib/AST/StmtProfile.cpp b/clang/lib/AST/StmtProfile.cpp
index c4f524142ba6317..ce3381781ff68fa 100644
--- a/clang/lib/AST/StmtProfile.cpp
+++ b/clang/lib/AST/StmtProfile.cpp
@@ -1353,7 +1353,7 @@ void StmtProfiler::VisitFixedPointLiteral(const FixedPointLiteral *S) {
void StmtProfiler::VisitCharacterLiteral(const CharacterLiteral *S) {
VisitExpr(S);
- ID.AddInteger(S->getKind());
+ ID.AddInteger(llvm::to_underlying(S->getKind()));
ID.AddInteger(S->getValue());
}
diff --git a/clang/lib/AST/TemplateBase.cpp b/clang/lib/AST/TemplateBase.cpp
index c46b3e3d0c50512..2ec0b2cce08ca49 100644
--- a/clang/lib/AST/TemplateBase.cpp
+++ b/clang/lib/AST/TemplateBase.cpp
@@ -89,19 +89,20 @@ static void printIntegral(const TemplateArgument &TemplArg, raw_ostream &Out,
else if (T->isSpecificBuiltinType(BuiltinType::UChar))
Out << "(unsigned char)";
}
- CharacterLiteral::print(Val.getZExtValue(), CharacterLiteral::Ascii, Out);
+ CharacterLiteral::print(Val.getZExtValue(), CharacterLiteralKind::Ascii,
+ Out);
} else if (T->isAnyCharacterType() && !Policy.MSVCFormatting) {
- CharacterLiteral::CharacterKind Kind;
+ CharacterLiteralKind Kind;
if (T->isWideCharType())
- Kind = CharacterLiteral::Wide;
+ Kind = CharacterLiteralKind::Wide;
else if (T->isChar8Type())
- Kind = CharacterLiteral::UTF8;
+ Kind = CharacterLiteralKind::UTF8;
else if (T->isChar16Type())
- Kind = CharacterLiteral::UTF16;
+ Kind = CharacterLiteralKind::UTF16;
else if (T->isChar32Type())
- Kind = CharacterLiteral::UTF32;
+ Kind = CharacterLiteralKind::UTF32;
else
- Kind = CharacterLiteral::Ascii;
+ Kind = CharacterLiteralKind::Ascii;
CharacterLiteral::print(Val.getExtValue(), Kind, Out);
} else if (IncludeType) {
if (const auto *BT = T->getAs<BuiltinType>()) {
diff --git a/clang/lib/Edit/RewriteObjCFoundationAPI.cpp b/clang/lib/Edit/RewriteObjCFoundationAPI.cpp
index 736e450574d9f80..adb34eba4970306 100644
--- a/clang/lib/Edit/RewriteObjCFoundationAPI.cpp
+++ b/clang/lib/Edit/RewriteObjCFoundationAPI.cpp
@@ -643,7 +643,7 @@ static bool shouldNotRewriteImmediateMessageArgs(const ObjCMessageExpr *Msg,
static bool rewriteToCharLiteral(const ObjCMessageExpr *Msg,
const CharacterLiteral *Arg,
const NSAPI &NS, Commit &commit) {
- if (Arg->getKind() != CharacterLiteral::Ascii)
+ if (Arg->getKind() != CharacterLiteralKind::Ascii)
return false;
if (NS.isNSNumberLiteralSelector(NSAPI::NSNumberWithChar,
Msg->getSelector())) {
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index 60e6b6d1e7c6e02..b9ff45ecac8fdbf 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -3814,15 +3814,15 @@ ExprResult Sema::ActOnCharacterConstant(const Token &Tok, Scope *UDLScope) {
Ty = Context.CharTy; // 'x' -> char in C++;
// u8'x' -> char in C11-C17 and in C++ without char8_t.
- CharacterLiteral::CharacterKind Kind = CharacterLiteral::Ascii;
+ CharacterLiteralKind Kind = CharacterLiteralKind::Ascii;
if (Literal.isWide())
- Kind = CharacterLiteral::Wide;
+ Kind = CharacterLiteralKind::Wide;
else if (Literal.isUTF16())
- Kind = CharacterLiteral::UTF16;
+ Kind = CharacterLiteralKind::UTF16;
else if (Literal.isUTF32())
- Kind = CharacterLiteral::UTF32;
+ Kind = CharacterLiteralKind::UTF32;
else if (Literal.isUTF8())
- Kind = CharacterLiteral::UTF8;
+ Kind = CharacterLiteralKind::UTF8;
Expr *Lit = new (Context) CharacterLiteral(Literal.getValue(), Kind, Ty,
Tok.getLocation());
diff --git a/clang/lib/Sema/SemaExprObjC.cpp b/clang/lib/Sema/SemaExprObjC.cpp
index 4e72899551d3299..a8853f634c9cc95 100644
--- a/clang/lib/Sema/SemaExprObjC.cpp
+++ b/clang/lib/Sema/SemaExprObjC.cpp
@@ -321,20 +321,20 @@ ExprResult Sema::BuildObjCNumericLiteral(SourceLocation AtLoc, Expr *Number) {
// In C, character literals have type 'int'. That's not the type we want
// to use to determine the Objective-c literal kind.
switch (Char->getKind()) {
- case CharacterLiteral::Ascii:
- case CharacterLiteral::UTF8:
+ case CharacterLiteralKind::Ascii:
+ case CharacterLiteralKind::UTF8:
NumberType = Context.CharTy;
break;
- case CharacterLiteral::Wide:
+ case CharacterLiteralKind::Wide:
NumberType = Context.getWideCharType();
break;
- case CharacterLiteral::UTF16:
+ case CharacterLiteralKind::UTF16:
NumberType = Context.Char16Ty;
break;
- case CharacterLiteral::UTF32:
+ case CharacterLiteralKind::UTF32:
NumberType = Context.Char32Ty;
break;
}
@@ -611,20 +611,20 @@ ExprResult Sema::BuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
// In C, character literals have type 'int'. That's not the type we want
// to use to determine the Objective-c literal kind.
switch (Char->getKind()) {
- case CharacterLiteral::Ascii:
- case CharacterLiteral::UTF8:
+ case CharacterLiteralKind::Ascii:
+ case CharacterLiteralKind::UTF8:
ValueType = Context.CharTy;
break;
- case CharacterLiteral::Wide:
+ case CharacterLiteralKind::Wide:
ValueType = Context.getWideCharType();
break;
- case CharacterLiteral::UTF16:
+ case CharacterLiteralKind::UTF16:
ValueType = Context.Char16Ty;
break;
- case CharacterLiteral::UTF32:
+ case CharacterLiteralKind::UTF32:
ValueType = Context.Char32Ty;
break;
}
diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp
index ee354862212803f..6865e04b94b2050 100644
--- a/clang/lib/Sema/SemaTemplate.cpp
+++ b/clang/lib/Sema/SemaTemplate.cpp
@@ -7985,17 +7985,17 @@ Sema::BuildExpressionFromIntegralTemplateArgument(const TemplateArgument &Arg,
Expr *E;
if (T->isAnyCharacterType()) {
- CharacterLiteral::CharacterKind Kind;
+ CharacterLiteralKind Kind;
if (T->isWideCharType())
- Kind = CharacterLiteral::Wide;
+ Kind = CharacterLiteralKind::Wide;
else if (T->isChar8Type() && getLangOpts().Char8)
- Kind = CharacterLiteral::UTF8;
+ Kind = CharacterLiteralKind::UTF8;
else if (T->isChar16Type())
- Kind = CharacterLiteral::UTF16;
+ Kind = CharacterLiteralKind::UTF16;
else if (T->isChar32Type())
- Kind = CharacterLiteral::UTF32;
+ Kind = CharacterLiteralKind::UTF32;
else
- Kind = CharacterLiteral::Ascii;
+ Kind = CharacterLiteralKind::Ascii;
E = new (Context) CharacterLiteral(Arg.getAsIntegral().getZExtValue(),
Kind, T, Loc);
diff --git a/clang/lib/Serialization/ASTReaderStmt.cpp b/clang/lib/Serialization/ASTReaderStmt.cpp
index 21d33e1c57cc988..d7d0c0e5bb21b47 100644
--- a/clang/lib/Serialization/ASTReaderStmt.cpp
+++ b/clang/lib/Serialization/ASTReaderStmt.cpp
@@ -680,7 +680,7 @@ void ASTStmtReader::VisitCharacterLiteral(CharacterLiteral *E) {
VisitExpr(E);
E->setValue(Record.readInt());
E->setLocation(readSourceLocation());
- E->setKind(static_cast<CharacterLiteral::CharacterKind>(Record.readInt()));
+ E->setKind(static_cast<CharacterLiteralKind>(Record.readInt()));
}
void ASTStmtReader::VisitParenExpr(ParenExpr *E) {
diff --git a/clang/lib/Serialization/ASTWriterStmt.cpp b/clang/lib/Serialization/ASTWriterStmt.cpp
index be258130b97de9c..04f4ea9ce1f523d 100644
--- a/clang/lib/Serialization/ASTWriterStmt.cpp
+++ b/clang/lib/Serialization/ASTWriterStmt.cpp
@@ -706,7 +706,7 @@ void ASTStmtWriter::VisitCharacterLiteral(CharacterLiteral *E) {
VisitExpr(E);
Record.push_back(E->getValue());
Record.AddSourceLocation(E->getLocation());
- Record.push_back(E->getKind());
+ Record.push_back(llvm::to_underlying(E->getKind()));
AbbrevToUse = Writer.getCharacterLiteralAbbrev();
More information about the cfe-commits
mailing list