[clang] 99e7e7a - [clang][NFC] Refactor `SourceLocExpr::IdentKind`
Vlad Serebrennikov via cfe-commits
cfe-commits at lists.llvm.org
Sat Nov 4 02:43:33 PDT 2023
Author: Vlad Serebrennikov
Date: 2023-11-04T12:43:26+03:00
New Revision: 99e7e7a597fa4ebaa8ebacdc42eae9f0b976f54c
URL: https://github.com/llvm/llvm-project/commit/99e7e7a597fa4ebaa8ebacdc42eae9f0b976f54c
DIFF: https://github.com/llvm/llvm-project/commit/99e7e7a597fa4ebaa8ebacdc42eae9f0b976f54c.diff
LOG: [clang][NFC] Refactor `SourceLocExpr::IdentKind`
This patch converts `SourceLocExpr::IdentKind` into a scoped enum at namespace scope, making it eligible to be forward-declared. This is needed by `preferred_type` annotations on bit-fields.
Added:
Modified:
clang/include/clang/AST/Expr.h
clang/include/clang/Sema/Sema.h
clang/lib/AST/Expr.cpp
clang/lib/Parse/ParseExpr.cpp
clang/lib/Sema/SemaExpr.cpp
clang/lib/Sema/TreeTransform.h
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 87e80a5a37750ac..36f004d64617055 100644
--- a/clang/include/clang/AST/Expr.h
+++ b/clang/include/clang/AST/Expr.h
@@ -4735,6 +4735,16 @@ class VAArgExpr : public Expr {
}
};
+enum class SourceLocIdentKind {
+ Function,
+ FuncSig,
+ File,
+ FileName,
+ Line,
+ Column,
+ SourceLocStruct
+};
+
/// Represents a function call to one of __builtin_LINE(), __builtin_COLUMN(),
/// __builtin_FUNCTION(), __builtin_FUNCSIG(), __builtin_FILE(),
/// __builtin_FILE_NAME() or __builtin_source_location().
@@ -4743,19 +4753,9 @@ class SourceLocExpr final : public Expr {
DeclContext *ParentContext;
public:
- enum IdentKind {
- Function,
- FuncSig,
- File,
- FileName,
- Line,
- Column,
- SourceLocStruct
- };
-
- SourceLocExpr(const ASTContext &Ctx, IdentKind Type, QualType ResultTy,
- SourceLocation BLoc, SourceLocation RParenLoc,
- DeclContext *Context);
+ SourceLocExpr(const ASTContext &Ctx, SourceLocIdentKind Type,
+ QualType ResultTy, SourceLocation BLoc,
+ SourceLocation RParenLoc, DeclContext *Context);
/// Build an empty call expression.
explicit SourceLocExpr(EmptyShell Empty) : Expr(SourceLocExprClass, Empty) {}
@@ -4768,20 +4768,20 @@ class SourceLocExpr final : public Expr {
/// Return a string representing the name of the specific builtin function.
StringRef getBuiltinStr() const;
- IdentKind getIdentKind() const {
- return static_cast<IdentKind>(SourceLocExprBits.Kind);
+ SourceLocIdentKind getIdentKind() const {
+ return static_cast<SourceLocIdentKind>(SourceLocExprBits.Kind);
}
bool isIntType() const {
switch (getIdentKind()) {
- case File:
- case FileName:
- case Function:
- case FuncSig:
- case SourceLocStruct:
+ case SourceLocIdentKind::File:
+ case SourceLocIdentKind::FileName:
+ case SourceLocIdentKind::Function:
+ case SourceLocIdentKind::FuncSig:
+ case SourceLocIdentKind::SourceLocStruct:
return false;
- case Line:
- case Column:
+ case SourceLocIdentKind::Line:
+ case SourceLocIdentKind::Column:
return true;
}
llvm_unreachable("unknown source location expression kind");
diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h
index daed24be0a86d11..8a35cbe3e9502b6 100644
--- a/clang/include/clang/Sema/Sema.h
+++ b/clang/include/clang/Sema/Sema.h
@@ -6086,14 +6086,13 @@ class Sema final {
// __builtin_LINE(), __builtin_FUNCTION(), __builtin_FUNCSIG(),
// __builtin_FILE(), __builtin_COLUMN(), __builtin_source_location()
- ExprResult ActOnSourceLocExpr(SourceLocExpr::IdentKind Kind,
+ ExprResult ActOnSourceLocExpr(SourceLocIdentKind Kind,
SourceLocation BuiltinLoc,
SourceLocation RPLoc);
// Build a potentially resolved SourceLocExpr.
- ExprResult BuildSourceLocExpr(SourceLocExpr::IdentKind Kind,
- QualType ResultTy, SourceLocation BuiltinLoc,
- SourceLocation RPLoc,
+ ExprResult BuildSourceLocExpr(SourceLocIdentKind Kind, QualType ResultTy,
+ SourceLocation BuiltinLoc, SourceLocation RPLoc,
DeclContext *ParentContext);
// __null
diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp
index 5d3b510df1ef9b3..62467493e386e8d 100644
--- a/clang/lib/AST/Expr.cpp
+++ b/clang/lib/AST/Expr.cpp
@@ -2196,31 +2196,31 @@ bool BinaryOperator::isNullPointerArithmeticExtension(ASTContext &Ctx,
return true;
}
-SourceLocExpr::SourceLocExpr(const ASTContext &Ctx, IdentKind Kind,
+SourceLocExpr::SourceLocExpr(const ASTContext &Ctx, SourceLocIdentKind Kind,
QualType ResultTy, SourceLocation BLoc,
SourceLocation RParenLoc,
DeclContext *ParentContext)
: Expr(SourceLocExprClass, ResultTy, VK_PRValue, OK_Ordinary),
BuiltinLoc(BLoc), RParenLoc(RParenLoc), ParentContext(ParentContext) {
- SourceLocExprBits.Kind = Kind;
+ SourceLocExprBits.Kind = llvm::to_underlying(Kind);
setDependence(ExprDependence::None);
}
StringRef SourceLocExpr::getBuiltinStr() const {
switch (getIdentKind()) {
- case File:
+ case SourceLocIdentKind::File:
return "__builtin_FILE";
- case FileName:
+ case SourceLocIdentKind::FileName:
return "__builtin_FILE_NAME";
- case Function:
+ case SourceLocIdentKind::Function:
return "__builtin_FUNCTION";
- case FuncSig:
+ case SourceLocIdentKind::FuncSig:
return "__builtin_FUNCSIG";
- case Line:
+ case SourceLocIdentKind::Line:
return "__builtin_LINE";
- case Column:
+ case SourceLocIdentKind::Column:
return "__builtin_COLUMN";
- case SourceLocStruct:
+ case SourceLocIdentKind::SourceLocStruct:
return "__builtin_source_location";
}
llvm_unreachable("unexpected IdentKind!");
@@ -2255,7 +2255,7 @@ APValue SourceLocExpr::EvaluateInContext(const ASTContext &Ctx,
};
switch (getIdentKind()) {
- case SourceLocExpr::FileName: {
+ case SourceLocIdentKind::FileName: {
// __builtin_FILE_NAME() is a Clang-specific extension that expands to the
// the last part of __builtin_FILE().
SmallString<256> FileName;
@@ -2263,26 +2263,26 @@ APValue SourceLocExpr::EvaluateInContext(const ASTContext &Ctx,
FileName, PLoc, Ctx.getLangOpts(), Ctx.getTargetInfo());
return MakeStringLiteral(FileName);
}
- case SourceLocExpr::File: {
+ case SourceLocIdentKind::File: {
SmallString<256> Path(PLoc.getFilename());
clang::Preprocessor::processPathForFileMacro(Path, Ctx.getLangOpts(),
Ctx.getTargetInfo());
return MakeStringLiteral(Path);
}
- case SourceLocExpr::Function:
- case SourceLocExpr::FuncSig: {
+ case SourceLocIdentKind::Function:
+ case SourceLocIdentKind::FuncSig: {
const auto *CurDecl = dyn_cast<Decl>(Context);
- const auto Kind = getIdentKind() == SourceLocExpr::Function
+ const auto Kind = getIdentKind() == SourceLocIdentKind::Function
? PredefinedExpr::Function
: PredefinedExpr::FuncSig;
return MakeStringLiteral(
CurDecl ? PredefinedExpr::ComputeName(Kind, CurDecl) : std::string(""));
}
- case SourceLocExpr::Line:
+ case SourceLocIdentKind::Line:
return APValue(Ctx.MakeIntValue(PLoc.getLine(), Ctx.UnsignedIntTy));
- case SourceLocExpr::Column:
+ case SourceLocIdentKind::Column:
return APValue(Ctx.MakeIntValue(PLoc.getColumn(), Ctx.UnsignedIntTy));
- case SourceLocExpr::SourceLocStruct: {
+ case SourceLocIdentKind::SourceLocStruct: {
// Fill in a std::source_location::__impl structure, by creating an
// artificial file-scoped CompoundLiteralExpr, and returning a pointer to
// that.
diff --git a/clang/lib/Parse/ParseExpr.cpp b/clang/lib/Parse/ParseExpr.cpp
index dd2d9400b7747e3..53fba3b2f59242b 100644
--- a/clang/lib/Parse/ParseExpr.cpp
+++ b/clang/lib/Parse/ParseExpr.cpp
@@ -2820,22 +2820,22 @@ ExprResult Parser::ParseBuiltinPrimaryExpression() {
SkipUntil(tok::r_paren, StopAtSemi);
return ExprError();
}
- SourceLocExpr::IdentKind Kind = [&] {
+ SourceLocIdentKind Kind = [&] {
switch (T) {
case tok::kw___builtin_FILE:
- return SourceLocExpr::File;
+ return SourceLocIdentKind::File;
case tok::kw___builtin_FILE_NAME:
- return SourceLocExpr::FileName;
+ return SourceLocIdentKind::FileName;
case tok::kw___builtin_FUNCTION:
- return SourceLocExpr::Function;
+ return SourceLocIdentKind::Function;
case tok::kw___builtin_FUNCSIG:
- return SourceLocExpr::FuncSig;
+ return SourceLocIdentKind::FuncSig;
case tok::kw___builtin_LINE:
- return SourceLocExpr::Line;
+ return SourceLocIdentKind::Line;
case tok::kw___builtin_COLUMN:
- return SourceLocExpr::Column;
+ return SourceLocIdentKind::Column;
case tok::kw___builtin_source_location:
- return SourceLocExpr::SourceLocStruct;
+ return SourceLocIdentKind::SourceLocStruct;
default:
llvm_unreachable("invalid keyword");
}
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index 4a4cb02b0e4a6d7..2bdc5d50c14d127 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -17542,25 +17542,25 @@ static CXXRecordDecl *LookupStdSourceLocationImpl(Sema &S, SourceLocation Loc) {
return ImplDecl;
}
-ExprResult Sema::ActOnSourceLocExpr(SourceLocExpr::IdentKind Kind,
+ExprResult Sema::ActOnSourceLocExpr(SourceLocIdentKind Kind,
SourceLocation BuiltinLoc,
SourceLocation RPLoc) {
QualType ResultTy;
switch (Kind) {
- case SourceLocExpr::File:
- case SourceLocExpr::FileName:
- case SourceLocExpr::Function:
- case SourceLocExpr::FuncSig: {
+ case SourceLocIdentKind::File:
+ case SourceLocIdentKind::FileName:
+ case SourceLocIdentKind::Function:
+ case SourceLocIdentKind::FuncSig: {
QualType ArrTy = Context.getStringLiteralArrayType(Context.CharTy, 0);
ResultTy =
Context.getPointerType(ArrTy->getAsArrayTypeUnsafe()->getElementType());
break;
}
- case SourceLocExpr::Line:
- case SourceLocExpr::Column:
+ case SourceLocIdentKind::Line:
+ case SourceLocIdentKind::Column:
ResultTy = Context.UnsignedIntTy;
break;
- case SourceLocExpr::SourceLocStruct:
+ case SourceLocIdentKind::SourceLocStruct:
if (!StdSourceLocationImplDecl) {
StdSourceLocationImplDecl =
LookupStdSourceLocationImpl(*this, BuiltinLoc);
@@ -17575,8 +17575,7 @@ ExprResult Sema::ActOnSourceLocExpr(SourceLocExpr::IdentKind Kind,
return BuildSourceLocExpr(Kind, ResultTy, BuiltinLoc, RPLoc, CurContext);
}
-ExprResult Sema::BuildSourceLocExpr(SourceLocExpr::IdentKind Kind,
- QualType ResultTy,
+ExprResult Sema::BuildSourceLocExpr(SourceLocIdentKind Kind, QualType ResultTy,
SourceLocation BuiltinLoc,
SourceLocation RPLoc,
DeclContext *ParentContext) {
diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h
index ac12b39a5978b20..47a90321af68dc1 100644
--- a/clang/lib/Sema/TreeTransform.h
+++ b/clang/lib/Sema/TreeTransform.h
@@ -3587,8 +3587,8 @@ class TreeTransform {
///
/// By default, performs semantic analysis to build the new expression.
/// Subclasses may override this routine to provide
diff erent behavior.
- ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind,
- QualType ResultTy, SourceLocation BuiltinLoc,
+ ExprResult RebuildSourceLocExpr(SourceLocIdentKind Kind, QualType ResultTy,
+ SourceLocation BuiltinLoc,
SourceLocation RPLoc,
DeclContext *ParentContext) {
return getSema().BuildSourceLocExpr(Kind, ResultTy, BuiltinLoc, RPLoc,
@@ -12115,7 +12115,7 @@ TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
template <typename Derived>
ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) {
- bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function &&
+ bool NeedRebuildFunc = E->getIdentKind() == SourceLocIdentKind::Function &&
getSema().CurContext != E->getParentContext();
if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc)
diff --git a/clang/lib/Serialization/ASTReaderStmt.cpp b/clang/lib/Serialization/ASTReaderStmt.cpp
index 1bdc3fa3bea455a..b0d64a7dbd171c6 100644
--- a/clang/lib/Serialization/ASTReaderStmt.cpp
+++ b/clang/lib/Serialization/ASTReaderStmt.cpp
@@ -1293,8 +1293,7 @@ void ASTStmtReader::VisitSourceLocExpr(SourceLocExpr *E) {
E->ParentContext = readDeclAs<DeclContext>();
E->BuiltinLoc = readSourceLocation();
E->RParenLoc = readSourceLocation();
- E->SourceLocExprBits.Kind =
- static_cast<SourceLocExpr::IdentKind>(Record.readInt());
+ E->SourceLocExprBits.Kind = Record.readInt();
}
void ASTStmtReader::VisitAddrLabelExpr(AddrLabelExpr *E) {
diff --git a/clang/lib/Serialization/ASTWriterStmt.cpp b/clang/lib/Serialization/ASTWriterStmt.cpp
index 125ca17c0c1212e..0e6a2f8fe7286b2 100644
--- a/clang/lib/Serialization/ASTWriterStmt.cpp
+++ b/clang/lib/Serialization/ASTWriterStmt.cpp
@@ -1165,7 +1165,7 @@ void ASTStmtWriter::VisitSourceLocExpr(SourceLocExpr *E) {
Record.AddDeclRef(cast_or_null<Decl>(E->getParentContext()));
Record.AddSourceLocation(E->getBeginLoc());
Record.AddSourceLocation(E->getEndLoc());
- Record.push_back(E->getIdentKind());
+ Record.push_back(llvm::to_underlying(E->getIdentKind()));
Code = serialization::EXPR_SOURCE_LOC;
}
More information about the cfe-commits
mailing list