Skip to content

Commit 71ff749

Browse files
committed
1 parent 7888d66 commit 71ff749

File tree

7 files changed

+24
-98
lines changed

7 files changed

+24
-98
lines changed

clang/lib/AST/Decl.cpp

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -576,16 +576,13 @@ template <typename T> static bool isFirstInExternCContext(T *D) {
576576
return First->isInExternCContext();
577577
}
578578

579-
static bool isUnbracedLanguageLinkage(const DeclContext *DC) {
580-
if (const auto *SD = dyn_cast_if_present<LinkageSpecDecl>(DC))
581-
return !SD->hasBraces();
579+
static bool isSingleLineLanguageLinkage(const Decl &D) {
580+
if (const auto *SD = dyn_cast<LinkageSpecDecl>(D.getDeclContext()))
581+
if (!SD->hasBraces())
582+
return true;
582583
return false;
583584
}
584585

585-
static bool hasUnbracedLanguageLinkage(const Decl &D) {
586-
return isUnbracedLanguageLinkage(D.getDeclContext());
587-
}
588-
589586
static bool isDeclaredInModuleInterfaceOrPartition(const NamedDecl *D) {
590587
if (auto *M = D->getOwningModule())
591588
return M->isInterfaceOrPartition();
@@ -647,7 +644,7 @@ LinkageComputer::getLVForNamespaceScopeDecl(const NamedDecl *D,
647644

648645
if (Var->getStorageClass() != SC_Extern &&
649646
Var->getStorageClass() != SC_PrivateExtern &&
650-
!hasUnbracedLanguageLinkage(*Var))
647+
!isSingleLineLanguageLinkage(*Var))
651648
return LinkageInfo::internal();
652649
}
653650

@@ -2121,12 +2118,6 @@ VarDecl::VarDecl(Kind DK, ASTContext &C, DeclContext *DC,
21212118
"ParmVarDeclBitfields too large!");
21222119
static_assert(sizeof(NonParmVarDeclBitfields) <= sizeof(unsigned),
21232120
"NonParmVarDeclBitfields too large!");
2124-
2125-
// The unbraced `extern "C"` invariant is that the storage class
2126-
// specifier is omitted in the source code, i.e. SC_None (but is,
2127-
// implicitly, `extern`).
2128-
assert(!isUnbracedLanguageLinkage(DC) || SC == SC_None);
2129-
21302121
AllBits = 0;
21312122
VarDeclBits.SClass = SC;
21322123
// Everything else is implicitly initialized to false.
@@ -2310,7 +2301,7 @@ VarDecl::isThisDeclarationADefinition(ASTContext &C) const {
23102301
// A declaration directly contained in a linkage-specification is treated
23112302
// as if it contains the extern specifier for the purpose of determining
23122303
// the linkage of the declared name and whether it is a definition.
2313-
if (hasUnbracedLanguageLinkage(*this))
2304+
if (isSingleLineLanguageLinkage(*this))
23142305
return DeclarationOnly;
23152306

23162307
// C99 6.9.2p2:
@@ -3036,12 +3027,6 @@ FunctionDecl::FunctionDecl(Kind DK, ASTContext &C, DeclContext *DC,
30363027
DeclContext(DK), redeclarable_base(C), Body(), ODRHash(0),
30373028
EndRangeLoc(NameInfo.getEndLoc()), DNLoc(NameInfo.getInfo()) {
30383029
assert(T.isNull() || T->isFunctionType());
3039-
3040-
// The unbraced `extern "C"` invariant is that the storage class
3041-
// specifier is omitted in the source code, i.e. SC_None (but is,
3042-
// implicitly, `extern`).
3043-
assert(!isUnbracedLanguageLinkage(DC) || S == SC_None);
3044-
30453030
FunctionDeclBits.SClass = S;
30463031
FunctionDeclBits.IsInline = isInlineSpecified;
30473032
FunctionDeclBits.IsInlineSpecified = isInlineSpecified;

clang/lib/AST/DeclPrinter.cpp

Lines changed: 14 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -633,7 +633,7 @@ static void printExplicitSpecifier(ExplicitSpecifier ES, llvm::raw_ostream &Out,
633633
Out << Proto;
634634
}
635635

636-
static void maybePrintTagKeywordIfSupressingScopes(PrintingPolicy &Policy,
636+
static void MaybePrintTagKeywordIfSupressingScopes(PrintingPolicy &Policy,
637637
QualType T,
638638
llvm::raw_ostream &Out) {
639639
StringRef prefix = T->isClassType() ? "class "
@@ -643,22 +643,6 @@ static void maybePrintTagKeywordIfSupressingScopes(PrintingPolicy &Policy,
643643
Out << prefix;
644644
}
645645

646-
/// Return the language of the linkage spec of `D`, if applicable.
647-
///
648-
/// \Return - "C" if `D` has been declared with unbraced `extern "C"`
649-
/// - "C++" if `D` has been declared with unbraced `extern "C++"`
650-
/// - nullptr in any other case
651-
static const char *tryGetUnbracedLinkageLanguage(const Decl *D) {
652-
const auto *SD = dyn_cast<LinkageSpecDecl>(D->getDeclContext());
653-
if (!SD || SD->hasBraces())
654-
return nullptr;
655-
if (SD->getLanguage() == LinkageSpecLanguageIDs::C)
656-
return "C";
657-
assert(SD->getLanguage() == LinkageSpecLanguageIDs::CXX &&
658-
"unknown language in linkage specification");
659-
return "C++";
660-
}
661-
662646
void DeclPrinter::VisitFunctionDecl(FunctionDecl *D) {
663647
if (!D->getDescribedFunctionTemplate() &&
664648
!D->isFunctionTemplateSpecialization()) {
@@ -678,11 +662,6 @@ void DeclPrinter::VisitFunctionDecl(FunctionDecl *D) {
678662
CXXConversionDecl *ConversionDecl = dyn_cast<CXXConversionDecl>(D);
679663
CXXDeductionGuideDecl *GuideDecl = dyn_cast<CXXDeductionGuideDecl>(D);
680664
if (!Policy.SuppressSpecifiers) {
681-
if (const char *Lang = tryGetUnbracedLinkageLanguage(D)) {
682-
// the "extern" specifier is implicit
683-
assert(D->getStorageClass() == SC_None);
684-
Out << "extern \"" << Lang << "\" ";
685-
}
686665
switch (D->getStorageClass()) {
687666
case SC_None: break;
688667
case SC_Extern: Out << "extern "; break;
@@ -828,7 +807,7 @@ void DeclPrinter::VisitFunctionDecl(FunctionDecl *D) {
828807
}
829808
if (!Policy.SuppressTagKeyword && Policy.SuppressScope &&
830809
!Policy.SuppressUnwrittenScope)
831-
maybePrintTagKeywordIfSupressingScopes(Policy, AFT->getReturnType(),
810+
MaybePrintTagKeywordIfSupressingScopes(Policy, AFT->getReturnType(),
832811
Out);
833812
AFT->getReturnType().print(Out, Policy, Proto);
834813
Proto.clear();
@@ -953,11 +932,6 @@ void DeclPrinter::VisitVarDecl(VarDecl *D) {
953932
: D->getASTContext().getUnqualifiedObjCPointerType(D->getType());
954933

955934
if (!Policy.SuppressSpecifiers) {
956-
if (const char *Lang = tryGetUnbracedLinkageLanguage(D)) {
957-
// the "extern" specifier is implicit
958-
assert(D->getStorageClass() == SC_None);
959-
Out << "extern \"" << Lang << "\" ";
960-
}
961935
StorageClass SC = D->getStorageClass();
962936
if (SC != SC_None)
963937
Out << VarDecl::getStorageClassSpecifierString(SC) << " ";
@@ -987,7 +961,7 @@ void DeclPrinter::VisitVarDecl(VarDecl *D) {
987961

988962
if (!Policy.SuppressTagKeyword && Policy.SuppressScope &&
989963
!Policy.SuppressUnwrittenScope)
990-
maybePrintTagKeywordIfSupressingScopes(Policy, T, Out);
964+
MaybePrintTagKeywordIfSupressingScopes(Policy, T, Out);
991965

992966
printDeclType(T, (isa<ParmVarDecl>(D) && Policy.CleanUglifiedParameters &&
993967
D->getIdentifier())
@@ -1090,8 +1064,6 @@ void DeclPrinter::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) {
10901064

10911065
void DeclPrinter::VisitEmptyDecl(EmptyDecl *D) {
10921066
prettyPrintAttributes(D);
1093-
if (const char *Lang = tryGetUnbracedLinkageLanguage(D))
1094-
Out << "extern \"" << Lang << "\";";
10951067
}
10961068

10971069
void DeclPrinter::VisitCXXRecordDecl(CXXRecordDecl *D) {
@@ -1164,21 +1136,22 @@ void DeclPrinter::VisitCXXRecordDecl(CXXRecordDecl *D) {
11641136
}
11651137

11661138
void DeclPrinter::VisitLinkageSpecDecl(LinkageSpecDecl *D) {
1167-
if (!D->hasBraces()) {
1168-
VisitDeclContext(D);
1169-
return;
1170-
}
1171-
const char *L;
1139+
const char *l;
11721140
if (D->getLanguage() == LinkageSpecLanguageIDs::C)
1173-
L = "C";
1141+
l = "C";
11741142
else {
11751143
assert(D->getLanguage() == LinkageSpecLanguageIDs::CXX &&
11761144
"unknown language in linkage specification");
1177-
L = "C++";
1145+
l = "C++";
11781146
}
1179-
Out << "extern \"" << L << "\" {\n";
1180-
VisitDeclContext(D);
1181-
Indent() << "}";
1147+
1148+
Out << "extern \"" << l << "\" ";
1149+
if (D->hasBraces()) {
1150+
Out << "{\n";
1151+
VisitDeclContext(D);
1152+
Indent() << "}";
1153+
} else
1154+
Visit(*D->decls_begin());
11821155
}
11831156

11841157
void DeclPrinter::printTemplateParameters(const TemplateParameterList *Params,

clang/lib/Sema/SemaDecl.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2286,7 +2286,7 @@ FunctionDecl *Sema::CreateBuiltin(IdentifierInfo *II, QualType Type,
22862286
}
22872287

22882288
FunctionDecl *New = FunctionDecl::Create(Context, Parent, Loc, Loc, II, Type,
2289-
/*TInfo=*/nullptr, SC_None,
2289+
/*TInfo=*/nullptr, SC_Extern,
22902290
getCurFPFeatures().isFPConstrained(),
22912291
false, Type->isFunctionProtoType());
22922292
New->setImplicit();

clang/lib/Sema/SemaExpr.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6161,7 +6161,7 @@ static FunctionDecl *rewriteBuiltinFunctionDecl(Sema *Sema, ASTContext &Context,
61616161
FunctionDecl *OverloadDecl = FunctionDecl::Create(
61626162
Context, Parent, FDecl->getLocation(), FDecl->getLocation(),
61636163
FDecl->getIdentifier(), OverloadTy,
6164-
/*TInfo=*/nullptr, SC_None, Sema->getCurFPFeatures().isFPConstrained(),
6164+
/*TInfo=*/nullptr, SC_Extern, Sema->getCurFPFeatures().isFPConstrained(),
61656165
false,
61666166
/*hasPrototype=*/true);
61676167
SmallVector<ParmVarDecl*, 16> Params;

clang/test/AST/ast-print-language-linkage.cpp

Lines changed: 0 additions & 31 deletions
This file was deleted.

lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -881,7 +881,7 @@ class CodeComplete : public CodeCompleteConsumer {
881881
else
882882
ToInsert += "(";
883883
raw_string_ostream OS(Description);
884-
F->print(OS, m_desc_policy);
884+
F->print(OS, m_desc_policy, false);
885885
OS.flush();
886886
} else if (const VarDecl *V = dyn_cast<VarDecl>(D)) {
887887
Description = V->getType().getAsString(m_desc_policy);

lldb/source/Plugins/ExpressionParser/Clang/NameSearchContext.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,7 @@ clang::NamedDecl *NameSearchContext::AddFunDecl(const CompilerType &type,
7777

7878
clang::FunctionDecl *func_decl = FunctionDecl::Create(
7979
ast, context, SourceLocation(), SourceLocation(), decl_name, qual_type,
80-
nullptr, SC_None, /*UsesFPIntrin=*/false, isInlineSpecified,
81-
hasWrittenPrototype,
80+
nullptr, SC_Extern, /*UsesFPIntrin=*/false, isInlineSpecified, hasWrittenPrototype,
8281
isConstexprSpecified ? ConstexprSpecKind::Constexpr
8382
: ConstexprSpecKind::Unspecified);
8483

0 commit comments

Comments
 (0)