Skip to content

Commit

Permalink
[clang][NFC] Refactor LinkageSpecDecl::LanguageIDs
Browse files Browse the repository at this point in the history
This patch converts `LinkageSpecDecl::LanguageIDs` into scoped enum, and moves it to namespace scope, so that it can be forward-declared where required.
  • Loading branch information
Endilll committed Nov 1, 2023
1 parent 700d93b commit 6576120
Show file tree
Hide file tree
Showing 14 changed files with 53 additions and 46 deletions.
2 changes: 2 additions & 0 deletions clang/include/clang/AST/DeclBase.h
Original file line number Diff line number Diff line change
Expand Up @@ -1430,6 +1430,8 @@ enum class OMPDeclareReductionInitKind {

enum class ObjCImplementationControl { None, Required, Optional };

enum class LinkageSpecLanguageIDs;

/// DeclContext - This is used only as base class of specific decl types that
/// can act as declaration contexts. These decls are (only the top classes
/// that directly derive from DeclContext are mentioned, not their subclasses):
Expand Down
28 changes: 15 additions & 13 deletions clang/include/clang/AST/DeclCXX.h
Original file line number Diff line number Diff line change
Expand Up @@ -2897,6 +2897,12 @@ class CXXConversionDecl : public CXXMethodDecl {
static bool classofKind(Kind K) { return K == CXXConversion; }
};

/// Represents the language in a linkage specification.
///
/// The values are part of the serialization ABI for
/// ASTs and cannot be changed without altering that ABI.
enum class LinkageSpecLanguageIDs { C = 1, CXX = 2 };

/// Represents a linkage specification.
///
/// For example:
Expand All @@ -2907,37 +2913,33 @@ class LinkageSpecDecl : public Decl, public DeclContext {
virtual void anchor();
// This class stores some data in DeclContext::LinkageSpecDeclBits to save
// some space. Use the provided accessors to access it.
public:
/// Represents the language in a linkage specification.
///
/// The values are part of the serialization ABI for
/// ASTs and cannot be changed without altering that ABI.
enum LanguageIDs { lang_c = 1, lang_cxx = 2 };

private:
/// The source location for the extern keyword.
SourceLocation ExternLoc;

/// The source location for the right brace (if valid).
SourceLocation RBraceLoc;

LinkageSpecDecl(DeclContext *DC, SourceLocation ExternLoc,
SourceLocation LangLoc, LanguageIDs lang, bool HasBraces);
SourceLocation LangLoc, LinkageSpecLanguageIDs lang,
bool HasBraces);

public:
static LinkageSpecDecl *Create(ASTContext &C, DeclContext *DC,
SourceLocation ExternLoc,
SourceLocation LangLoc, LanguageIDs Lang,
bool HasBraces);
SourceLocation LangLoc,
LinkageSpecLanguageIDs Lang, bool HasBraces);
static LinkageSpecDecl *CreateDeserialized(ASTContext &C, unsigned ID);

/// Return the language specified by this linkage specification.
LanguageIDs getLanguage() const {
return static_cast<LanguageIDs>(LinkageSpecDeclBits.Language);
LinkageSpecLanguageIDs getLanguage() const {
return static_cast<LinkageSpecLanguageIDs>(LinkageSpecDeclBits.Language);
}

/// Set the language specified by this linkage specification.
void setLanguage(LanguageIDs L) { LinkageSpecDeclBits.Language = L; }
void setLanguage(LinkageSpecLanguageIDs L) {
LinkageSpecDeclBits.Language = llvm::to_underlying(L);
}

/// Determines whether this linkage specification had braces in
/// its syntactic form.
Expand Down
8 changes: 4 additions & 4 deletions clang/lib/AST/DeclBase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1320,7 +1320,7 @@ bool DeclContext::isTransparentContext() const {
}

static bool isLinkageSpecContext(const DeclContext *DC,
LinkageSpecDecl::LanguageIDs ID) {
LinkageSpecLanguageIDs ID) {
while (DC->getDeclKind() != Decl::TranslationUnit) {
if (DC->getDeclKind() == Decl::LinkageSpec)
return cast<LinkageSpecDecl>(DC)->getLanguage() == ID;
Expand All @@ -1330,22 +1330,22 @@ static bool isLinkageSpecContext(const DeclContext *DC,
}

bool DeclContext::isExternCContext() const {
return isLinkageSpecContext(this, LinkageSpecDecl::lang_c);
return isLinkageSpecContext(this, LinkageSpecLanguageIDs::C);
}

const LinkageSpecDecl *DeclContext::getExternCContext() const {
const DeclContext *DC = this;
while (DC->getDeclKind() != Decl::TranslationUnit) {
if (DC->getDeclKind() == Decl::LinkageSpec &&
cast<LinkageSpecDecl>(DC)->getLanguage() == LinkageSpecDecl::lang_c)
cast<LinkageSpecDecl>(DC)->getLanguage() == LinkageSpecLanguageIDs::C)
return cast<LinkageSpecDecl>(DC);
DC = DC->getLexicalParent();
}
return nullptr;
}

bool DeclContext::isExternCXXContext() const {
return isLinkageSpecContext(this, LinkageSpecDecl::lang_cxx);
return isLinkageSpecContext(this, LinkageSpecLanguageIDs::CXX);
}

bool DeclContext::Encloses(const DeclContext *DC) const {
Expand Down
14 changes: 7 additions & 7 deletions clang/lib/AST/DeclCXX.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2854,8 +2854,8 @@ bool CXXConversionDecl::isLambdaToBlockPointerConversion() const {
}

LinkageSpecDecl::LinkageSpecDecl(DeclContext *DC, SourceLocation ExternLoc,
SourceLocation LangLoc, LanguageIDs lang,
bool HasBraces)
SourceLocation LangLoc,
LinkageSpecLanguageIDs lang, bool HasBraces)
: Decl(LinkageSpec, DC, LangLoc), DeclContext(LinkageSpec),
ExternLoc(ExternLoc), RBraceLoc(SourceLocation()) {
setLanguage(lang);
Expand All @@ -2864,19 +2864,19 @@ LinkageSpecDecl::LinkageSpecDecl(DeclContext *DC, SourceLocation ExternLoc,

void LinkageSpecDecl::anchor() {}

LinkageSpecDecl *LinkageSpecDecl::Create(ASTContext &C,
DeclContext *DC,
LinkageSpecDecl *LinkageSpecDecl::Create(ASTContext &C, DeclContext *DC,
SourceLocation ExternLoc,
SourceLocation LangLoc,
LanguageIDs Lang,
LinkageSpecLanguageIDs Lang,
bool HasBraces) {
return new (C, DC) LinkageSpecDecl(DC, ExternLoc, LangLoc, Lang, HasBraces);
}

LinkageSpecDecl *LinkageSpecDecl::CreateDeserialized(ASTContext &C,
unsigned ID) {
return new (C, ID) LinkageSpecDecl(nullptr, SourceLocation(),
SourceLocation(), lang_c, false);
return new (C, ID)
LinkageSpecDecl(nullptr, SourceLocation(), SourceLocation(),
LinkageSpecLanguageIDs::C, false);
}

void UsingDirectiveDecl::anchor() {}
Expand Down
4 changes: 2 additions & 2 deletions clang/lib/AST/DeclPrinter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1194,10 +1194,10 @@ void DeclPrinter::VisitCXXRecordDecl(CXXRecordDecl *D) {

void DeclPrinter::VisitLinkageSpecDecl(LinkageSpecDecl *D) {
const char *l;
if (D->getLanguage() == LinkageSpecDecl::lang_c)
if (D->getLanguage() == LinkageSpecLanguageIDs::C)
l = "C";
else {
assert(D->getLanguage() == LinkageSpecDecl::lang_cxx &&
assert(D->getLanguage() == LinkageSpecLanguageIDs::CXX &&
"unknown language in linkage specification");
l = "C++";
}
Expand Down
8 changes: 6 additions & 2 deletions clang/lib/AST/JSONNodeDumper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1027,8 +1027,12 @@ void JSONNodeDumper::VisitTemplateTemplateParmDecl(
void JSONNodeDumper::VisitLinkageSpecDecl(const LinkageSpecDecl *LSD) {
StringRef Lang;
switch (LSD->getLanguage()) {
case LinkageSpecDecl::lang_c: Lang = "C"; break;
case LinkageSpecDecl::lang_cxx: Lang = "C++"; break;
case LinkageSpecLanguageIDs::C:
Lang = "C";
break;
case LinkageSpecLanguageIDs::CXX:
Lang = "C++";
break;
}
JOS.attribute("language", Lang);
attributeOnlyIfTrue("hasBraces", LSD->hasBraces());
Expand Down
4 changes: 2 additions & 2 deletions clang/lib/AST/TextNodeDumper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2413,10 +2413,10 @@ void TextNodeDumper::VisitConstructorUsingShadowDecl(

void TextNodeDumper::VisitLinkageSpecDecl(const LinkageSpecDecl *D) {
switch (D->getLanguage()) {
case LinkageSpecDecl::lang_c:
case LinkageSpecLanguageIDs::C:
OS << " C";
break;
case LinkageSpecDecl::lang_cxx:
case LinkageSpecLanguageIDs::CXX:
OS << " C++";
break;
}
Expand Down
4 changes: 2 additions & 2 deletions clang/lib/CodeGen/CodeGenModule.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6514,8 +6514,8 @@ void CodeGenModule::EmitObjCIvarInitializations(ObjCImplementationDecl *D) {

// EmitLinkageSpec - Emit all declarations in a linkage spec.
void CodeGenModule::EmitLinkageSpec(const LinkageSpecDecl *LSD) {
if (LSD->getLanguage() != LinkageSpecDecl::lang_c &&
LSD->getLanguage() != LinkageSpecDecl::lang_cxx) {
if (LSD->getLanguage() != LinkageSpecLanguageIDs::C &&
LSD->getLanguage() != LinkageSpecLanguageIDs::CXX) {
ErrorUnsupported(LSD, "linkage spec");
return;
}
Expand Down
7 changes: 3 additions & 4 deletions clang/lib/Sema/SemaDecl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2407,7 +2407,7 @@ FunctionDecl *Sema::CreateBuiltin(IdentifierInfo *II, QualType Type,

if (getLangOpts().CPlusPlus) {
LinkageSpecDecl *CLinkageDecl = LinkageSpecDecl::Create(
Context, Parent, Loc, Loc, LinkageSpecDecl::lang_c, false);
Context, Parent, Loc, Loc, LinkageSpecLanguageIDs::C, false);
CLinkageDecl->setImplicit();
Parent->addDecl(CLinkageDecl);
Parent = CLinkageDecl;
Expand Down Expand Up @@ -16627,11 +16627,10 @@ void Sema::AddKnownFunctionAttributes(FunctionDecl *FD) {
IdentifierInfo *Name = FD->getIdentifier();
if (!Name)
return;
if ((!getLangOpts().CPlusPlus &&
FD->getDeclContext()->isTranslationUnit()) ||
if ((!getLangOpts().CPlusPlus && FD->getDeclContext()->isTranslationUnit()) ||
(isa<LinkageSpecDecl>(FD->getDeclContext()) &&
cast<LinkageSpecDecl>(FD->getDeclContext())->getLanguage() ==
LinkageSpecDecl::lang_c)) {
LinkageSpecLanguageIDs::C)) {
// Okay: this could be a libc/libm/Objective-C function we know
// about.
} else
Expand Down
6 changes: 3 additions & 3 deletions clang/lib/Sema/SemaDeclCXX.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16784,11 +16784,11 @@ Decl *Sema::ActOnStartLinkageSpecification(Scope *S, SourceLocation ExternLoc,
assert(Lit->isUnevaluated() && "Unexpected string literal kind");

StringRef Lang = Lit->getString();
LinkageSpecDecl::LanguageIDs Language;
LinkageSpecLanguageIDs Language;
if (Lang == "C")
Language = LinkageSpecDecl::lang_c;
Language = LinkageSpecLanguageIDs::C;
else if (Lang == "C++")
Language = LinkageSpecDecl::lang_cxx;
Language = LinkageSpecLanguageIDs::CXX;
else {
Diag(LangStr->getExprLoc(), diag::err_language_linkage_spec_unknown)
<< LangStr->getSourceRange();
Expand Down
4 changes: 2 additions & 2 deletions clang/lib/Sema/SemaModule.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,11 @@ static void checkModuleImportContext(Sema &S, Module *M,

if (auto *LSD = dyn_cast<LinkageSpecDecl>(DC)) {
switch (LSD->getLanguage()) {
case LinkageSpecDecl::lang_c:
case LinkageSpecLanguageIDs::C:
if (ExternCLoc.isInvalid())
ExternCLoc = LSD->getBeginLoc();
break;
case LinkageSpecDecl::lang_cxx:
case LinkageSpecLanguageIDs::CXX:
break;
}
DC = LSD->getParent();
Expand Down
2 changes: 1 addition & 1 deletion clang/lib/Serialization/ASTReaderDecl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1773,7 +1773,7 @@ void ASTDeclReader::VisitCapturedDecl(CapturedDecl *CD) {

void ASTDeclReader::VisitLinkageSpecDecl(LinkageSpecDecl *D) {
VisitDecl(D);
D->setLanguage((LinkageSpecDecl::LanguageIDs)Record.readInt());
D->setLanguage(static_cast<LinkageSpecLanguageIDs>(Record.readInt()));
D->setExternLoc(readSourceLocation());
D->setRBraceLoc(readSourceLocation());
}
Expand Down
2 changes: 1 addition & 1 deletion clang/lib/Serialization/ASTWriterDecl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1273,7 +1273,7 @@ void ASTDeclWriter::VisitLinkageSpecDecl(LinkageSpecDecl *D) {
"LinkageSpecDeclBits");

VisitDecl(D);
Record.push_back(D->getLanguage());
Record.push_back(llvm::to_underlying(D->getLanguage()));
Record.AddSourceLocation(D->getExternLoc());
Record.AddSourceLocation(D->getRBraceLoc());
Code = serialization::DECL_LINKAGE_SPEC;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,9 @@ clang::NamedDecl *NameSearchContext::AddFunDecl(const CompilerType &type,
clang::DeclContext *context = const_cast<DeclContext *>(m_decl_context);

if (extern_c) {
context = LinkageSpecDecl::Create(
ast, context, SourceLocation(), SourceLocation(),
clang::LinkageSpecDecl::LanguageIDs::lang_c, false);
context = LinkageSpecDecl::Create(ast, context, SourceLocation(),
SourceLocation(),
clang::LinkageSpecLanguageIDs::C, false);
// FIXME: The LinkageSpecDecl here should be added to m_decl_context.
}

Expand Down

0 comments on commit 6576120

Please sign in to comment.