Skip to content

Commit 5949892

Browse files
committed
Merge remote-tracking branch 'origin/main' into pr/multiple-truncs
2 parents 1304b2b + 8247068 commit 5949892

File tree

63 files changed

+876
-468
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+876
-468
lines changed

clang/include/clang/Basic/DebugOptions.def

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ BENIGN_DEBUGOPT(NoInlineLineTables, 1, 0) ///< Whether debug info should contain
6868
///< inline line tables.
6969

7070
DEBUGOPT(DebugStrictDwarf, 1, 1) ///< Whether or not to use strict DWARF info.
71+
DEBUGOPT(DebugOmitUnreferencedMethods, 1, 0) ///< Omit unreferenced member
72+
///< functions in type debug info.
7173

7274
/// Control the Assignment Tracking debug info feature.
7375
BENIGN_ENUM_DEBUGOPT(AssignmentTrackingMode, AssignmentTrackingOpts, 2,

clang/include/clang/Driver/Options.td

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4345,6 +4345,10 @@ defm strict_dwarf : BoolOption<"g", "strict-dwarf",
43454345
"the specified version, avoiding features from later versions.">,
43464346
NegFlag<SetFalse>, BothFlags<[], [ClangOption, CLOption, DXCOption]>>,
43474347
Group<g_flags_Group>;
4348+
defm omit_unreferenced_methods : BoolGOption<"omit-unreferenced-methods",
4349+
CodeGenOpts<"DebugOmitUnreferencedMethods">, DefaultFalse,
4350+
NegFlag<SetFalse>,
4351+
PosFlag<SetTrue, [], [CC1Option]>, BothFlags<[], [ClangOption, CLOption, DXCOption]>>;
43484352
defm column_info : BoolOption<"g", "column-info",
43494353
CodeGenOpts<"DebugColumnInfo">, DefaultTrue,
43504354
NegFlag<SetFalse, [], [ClangOption, CC1Option]>,

clang/include/clang/Sema/Sema.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -895,9 +895,6 @@ class Sema final : public SemaBase {
895895
void disable() { Active = false; }
896896
};
897897

898-
/// Build a partial diagnostic.
899-
PartialDiagnostic PDiag(unsigned DiagID = 0); // in SemaInternal.h
900-
901898
sema::FunctionScopeInfo *getCurFunction() const {
902899
return FunctionScopes.empty() ? nullptr : FunctionScopes.back();
903900
}

clang/include/clang/Sema/SemaBase.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,9 @@ class SemaBase {
217217
/// Emit a partial diagnostic.
218218
SemaDiagnosticBuilder Diag(SourceLocation Loc, const PartialDiagnostic &PD,
219219
bool DeferHint = false);
220+
221+
/// Build a partial diagnostic.
222+
PartialDiagnostic PDiag(unsigned DiagID = 0);
220223
};
221224

222225
} // namespace clang

clang/include/clang/Sema/SemaInternal.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,6 @@
2121

2222
namespace clang {
2323

24-
inline PartialDiagnostic Sema::PDiag(unsigned DiagID) {
25-
return PartialDiagnostic(DiagID, Context.getDiagAllocator());
26-
}
27-
2824
inline bool
2925
FTIHasSingleVoidParameter(const DeclaratorChunk::FunctionTypeInfo &FTI) {
3026
return FTI.NumParams == 1 && !FTI.isVariadic &&

clang/lib/AST/DeclPrinter.cpp

Lines changed: 41 additions & 14 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,6 +643,22 @@ 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+
646662
void DeclPrinter::VisitFunctionDecl(FunctionDecl *D) {
647663
if (!D->getDescribedFunctionTemplate() &&
648664
!D->isFunctionTemplateSpecialization()) {
@@ -662,6 +678,11 @@ void DeclPrinter::VisitFunctionDecl(FunctionDecl *D) {
662678
CXXConversionDecl *ConversionDecl = dyn_cast<CXXConversionDecl>(D);
663679
CXXDeductionGuideDecl *GuideDecl = dyn_cast<CXXDeductionGuideDecl>(D);
664680
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+
}
665686
switch (D->getStorageClass()) {
666687
case SC_None: break;
667688
case SC_Extern: Out << "extern "; break;
@@ -807,7 +828,7 @@ void DeclPrinter::VisitFunctionDecl(FunctionDecl *D) {
807828
}
808829
if (!Policy.SuppressTagKeyword && Policy.SuppressScope &&
809830
!Policy.SuppressUnwrittenScope)
810-
MaybePrintTagKeywordIfSupressingScopes(Policy, AFT->getReturnType(),
831+
maybePrintTagKeywordIfSupressingScopes(Policy, AFT->getReturnType(),
811832
Out);
812833
AFT->getReturnType().print(Out, Policy, Proto);
813834
Proto.clear();
@@ -932,6 +953,11 @@ void DeclPrinter::VisitVarDecl(VarDecl *D) {
932953
: D->getASTContext().getUnqualifiedObjCPointerType(D->getType());
933954

934955
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+
}
935961
StorageClass SC = D->getStorageClass();
936962
if (SC != SC_None)
937963
Out << VarDecl::getStorageClassSpecifierString(SC) << " ";
@@ -961,7 +987,7 @@ void DeclPrinter::VisitVarDecl(VarDecl *D) {
961987

962988
if (!Policy.SuppressTagKeyword && Policy.SuppressScope &&
963989
!Policy.SuppressUnwrittenScope)
964-
MaybePrintTagKeywordIfSupressingScopes(Policy, T, Out);
990+
maybePrintTagKeywordIfSupressingScopes(Policy, T, Out);
965991

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

10651091
void DeclPrinter::VisitEmptyDecl(EmptyDecl *D) {
10661092
prettyPrintAttributes(D);
1093+
if (const char *Lang = tryGetUnbracedLinkageLanguage(D))
1094+
Out << "extern \"" << Lang << "\";";
10671095
}
10681096

10691097
void DeclPrinter::VisitCXXRecordDecl(CXXRecordDecl *D) {
@@ -1136,22 +1164,21 @@ void DeclPrinter::VisitCXXRecordDecl(CXXRecordDecl *D) {
11361164
}
11371165

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

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

clang/lib/CodeGen/CGDebugInfo.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2836,7 +2836,7 @@ CGDebugInfo::CreateTypeDefinition(const RecordType *Ty) {
28362836

28372837
// Collect data fields (including static variables and any initializers).
28382838
CollectRecordFields(RD, DefUnit, EltTys, FwdDecl);
2839-
if (CXXDecl)
2839+
if (CXXDecl && !CGM.getCodeGenOpts().DebugOmitUnreferencedMethods)
28402840
CollectCXXMemberFunctions(CXXDecl, DefUnit, EltTys, FwdDecl);
28412841

28422842
LexicalBlockStack.pop_back();

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
#include "llvm/ADT/StringExtras.h"
4646
#include "llvm/BinaryFormat/Magic.h"
4747
#include "llvm/Config/llvm-config.h"
48+
#include "llvm/Frontend/Debug/Options.h"
4849
#include "llvm/Object/ObjectFile.h"
4950
#include "llvm/Option/ArgList.h"
5051
#include "llvm/Support/CodeGen.h"
@@ -4642,6 +4643,7 @@ renderDebugOptions(const ToolChain &TC, const Driver &D, const llvm::Triple &T,
46424643
Args.addOptInFlag(CmdArgs, options::OPT_fforce_dwarf_frame,
46434644
options::OPT_fno_force_dwarf_frame);
46444645

4646+
bool EnableTypeUnits = false;
46454647
if (Args.hasFlag(options::OPT_fdebug_types_section,
46464648
options::OPT_fno_debug_types_section, false)) {
46474649
if (!(T.isOSBinFormatELF() || T.isOSBinFormatWasm())) {
@@ -4652,11 +4654,24 @@ renderDebugOptions(const ToolChain &TC, const Driver &D, const llvm::Triple &T,
46524654
} else if (checkDebugInfoOption(
46534655
Args.getLastArg(options::OPT_fdebug_types_section), Args, D,
46544656
TC)) {
4657+
EnableTypeUnits = true;
46554658
CmdArgs.push_back("-mllvm");
46564659
CmdArgs.push_back("-generate-type-units");
46574660
}
46584661
}
46594662

4663+
if (const Arg *A =
4664+
Args.getLastArg(options::OPT_gomit_unreferenced_methods,
4665+
options::OPT_gno_omit_unreferenced_methods))
4666+
(void)checkDebugInfoOption(A, Args, D, TC);
4667+
if (Args.hasFlag(options::OPT_gomit_unreferenced_methods,
4668+
options::OPT_gno_omit_unreferenced_methods, false) &&
4669+
(DebugInfoKind == llvm::codegenoptions::DebugInfoConstructor ||
4670+
DebugInfoKind == llvm::codegenoptions::LimitedDebugInfo) &&
4671+
!EnableTypeUnits) {
4672+
CmdArgs.push_back("-gomit-unreferenced-methods");
4673+
}
4674+
46604675
// To avoid join/split of directory+filename, the integrated assembler prefers
46614676
// the directory form of .file on all DWARF versions. GNU as doesn't allow the
46624677
// form before DWARF v5.

clang/lib/Parse/ParseOpenMP.cpp

Lines changed: 24 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@
2424
#include "clang/Sema/SemaAMDGPU.h"
2525
#include "clang/Sema/SemaCodeCompletion.h"
2626
#include "clang/Sema/SemaOpenMP.h"
27-
#include "llvm/ADT/PointerIntPair.h"
2827
#include "llvm/ADT/StringSwitch.h"
2928
#include "llvm/Frontend/OpenMP/OMPAssume.h"
3029
#include "llvm/Frontend/OpenMP/OMPContext.h"
30+
#include <bitset>
3131
#include <optional>
3232

3333
using namespace clang;
@@ -1646,19 +1646,17 @@ bool Parser::parseOMPDeclareVariantMatchClause(SourceLocation Loc,
16461646
void Parser::ParseOpenMPClauses(OpenMPDirectiveKind DKind,
16471647
SmallVectorImpl<OMPClause *> &Clauses,
16481648
SourceLocation Loc) {
1649-
SmallVector<llvm::PointerIntPair<OMPClause *, 1, bool>,
1650-
llvm::omp::Clause_enumSize + 1>
1651-
FirstClauses(llvm::omp::Clause_enumSize + 1);
1649+
std::bitset<llvm::omp::Clause_enumSize + 1> SeenClauses;
16521650
while (Tok.isNot(tok::annot_pragma_openmp_end)) {
16531651
OpenMPClauseKind CKind = Tok.isAnnotation()
16541652
? OMPC_unknown
16551653
: getOpenMPClauseKind(PP.getSpelling(Tok));
16561654
Actions.OpenMP().StartOpenMPClause(CKind);
1657-
OMPClause *Clause = ParseOpenMPClause(
1658-
DKind, CKind, !FirstClauses[unsigned(CKind)].getInt());
1655+
OMPClause *Clause =
1656+
ParseOpenMPClause(DKind, CKind, !SeenClauses[unsigned(CKind)]);
16591657
SkipUntil(tok::comma, tok::identifier, tok::annot_pragma_openmp_end,
16601658
StopBeforeMatch);
1661-
FirstClauses[unsigned(CKind)].setInt(true);
1659+
SeenClauses[unsigned(CKind)] = true;
16621660
if (Clause != nullptr)
16631661
Clauses.push_back(Clause);
16641662
if (Tok.is(tok::annot_pragma_openmp_end)) {
@@ -2114,19 +2112,17 @@ Parser::DeclGroupPtrTy Parser::ParseOpenMPDeclarativeDirectiveWithExtDecl(
21142112
/*AllowScopeSpecifier=*/true)) {
21152113
SmallVector<OMPClause *, 1> Clauses;
21162114
if (Tok.isNot(tok::annot_pragma_openmp_end)) {
2117-
SmallVector<llvm::PointerIntPair<OMPClause *, 1, bool>,
2118-
llvm::omp::Clause_enumSize + 1>
2119-
FirstClauses(llvm::omp::Clause_enumSize + 1);
2115+
std::bitset<llvm::omp::Clause_enumSize + 1> SeenClauses;
21202116
while (Tok.isNot(tok::annot_pragma_openmp_end)) {
21212117
OpenMPClauseKind CKind =
21222118
Tok.isAnnotation() ? OMPC_unknown
21232119
: getOpenMPClauseKind(PP.getSpelling(Tok));
21242120
Actions.OpenMP().StartOpenMPClause(CKind);
2125-
OMPClause *Clause = ParseOpenMPClause(
2126-
OMPD_allocate, CKind, !FirstClauses[unsigned(CKind)].getInt());
2121+
OMPClause *Clause = ParseOpenMPClause(OMPD_allocate, CKind,
2122+
!SeenClauses[unsigned(CKind)]);
21272123
SkipUntil(tok::comma, tok::identifier, tok::annot_pragma_openmp_end,
21282124
StopBeforeMatch);
2129-
FirstClauses[unsigned(CKind)].setInt(true);
2125+
SeenClauses[unsigned(CKind)] = true;
21302126
if (Clause != nullptr)
21312127
Clauses.push_back(Clause);
21322128
if (Tok.is(tok::annot_pragma_openmp_end)) {
@@ -2150,9 +2146,7 @@ Parser::DeclGroupPtrTy Parser::ParseOpenMPDeclarativeDirectiveWithExtDecl(
21502146
case OMPD_requires: {
21512147
SourceLocation StartLoc = ConsumeToken();
21522148
SmallVector<OMPClause *, 5> Clauses;
2153-
SmallVector<llvm::PointerIntPair<OMPClause *, 1, bool>,
2154-
llvm::omp::Clause_enumSize + 1>
2155-
FirstClauses(llvm::omp::Clause_enumSize + 1);
2149+
std::bitset<llvm::omp::Clause_enumSize + 1> SeenClauses;
21562150
if (Tok.is(tok::annot_pragma_openmp_end)) {
21572151
Diag(Tok, diag::err_omp_expected_clause)
21582152
<< getOpenMPDirectiveName(OMPD_requires);
@@ -2163,11 +2157,11 @@ Parser::DeclGroupPtrTy Parser::ParseOpenMPDeclarativeDirectiveWithExtDecl(
21632157
? OMPC_unknown
21642158
: getOpenMPClauseKind(PP.getSpelling(Tok));
21652159
Actions.OpenMP().StartOpenMPClause(CKind);
2166-
OMPClause *Clause = ParseOpenMPClause(
2167-
OMPD_requires, CKind, !FirstClauses[unsigned(CKind)].getInt());
2160+
OMPClause *Clause = ParseOpenMPClause(OMPD_requires, CKind,
2161+
!SeenClauses[unsigned(CKind)]);
21682162
SkipUntil(tok::comma, tok::identifier, tok::annot_pragma_openmp_end,
21692163
StopBeforeMatch);
2170-
FirstClauses[unsigned(CKind)].setInt(true);
2164+
SeenClauses[unsigned(CKind)] = true;
21712165
if (Clause != nullptr)
21722166
Clauses.push_back(Clause);
21732167
if (Tok.is(tok::annot_pragma_openmp_end)) {
@@ -2510,9 +2504,7 @@ StmtResult Parser::ParseOpenMPDeclarativeOrExecutableDirective(
25102504
ParsingOpenMPDirectiveRAII DirScope(*this);
25112505
ParenBraceBracketBalancer BalancerRAIIObj(*this);
25122506
SmallVector<OMPClause *, 5> Clauses;
2513-
SmallVector<llvm::PointerIntPair<OMPClause *, 1, bool>,
2514-
llvm::omp::Clause_enumSize + 1>
2515-
FirstClauses(llvm::omp::Clause_enumSize + 1);
2507+
std::bitset<llvm::omp::Clause_enumSize + 1> SeenClauses;
25162508
unsigned ScopeFlags = Scope::FnScope | Scope::DeclScope |
25172509
Scope::CompoundStmtScope | Scope::OpenMPDirectiveScope;
25182510
SourceLocation Loc = ReadDirectiveWithinMetadirective
@@ -2717,19 +2709,17 @@ StmtResult Parser::ParseOpenMPDeclarativeOrExecutableDirective(
27172709
/*AllowScopeSpecifier=*/false)) {
27182710
SmallVector<OMPClause *, 1> Clauses;
27192711
if (Tok.isNot(tok::annot_pragma_openmp_end)) {
2720-
SmallVector<llvm::PointerIntPair<OMPClause *, 1, bool>,
2721-
llvm::omp::Clause_enumSize + 1>
2722-
FirstClauses(llvm::omp::Clause_enumSize + 1);
2712+
std::bitset<llvm::omp::Clause_enumSize + 1> SeenClauses;
27232713
while (Tok.isNot(tok::annot_pragma_openmp_end)) {
27242714
OpenMPClauseKind CKind =
27252715
Tok.isAnnotation() ? OMPC_unknown
27262716
: getOpenMPClauseKind(PP.getSpelling(Tok));
27272717
Actions.OpenMP().StartOpenMPClause(CKind);
2728-
OMPClause *Clause = ParseOpenMPClause(
2729-
OMPD_allocate, CKind, !FirstClauses[unsigned(CKind)].getInt());
2718+
OMPClause *Clause = ParseOpenMPClause(OMPD_allocate, CKind,
2719+
!SeenClauses[unsigned(CKind)]);
27302720
SkipUntil(tok::comma, tok::identifier, tok::annot_pragma_openmp_end,
27312721
StopBeforeMatch);
2732-
FirstClauses[unsigned(CKind)].setInt(true);
2722+
SeenClauses[unsigned(CKind)] = true;
27332723
if (Clause != nullptr)
27342724
Clauses.push_back(Clause);
27352725
if (Tok.is(tok::annot_pragma_openmp_end)) {
@@ -2926,13 +2916,11 @@ StmtResult Parser::ParseOpenMPDeclarativeOrExecutableDirective(
29262916
ImplicitClauseAllowed = false;
29272917
Actions.OpenMP().StartOpenMPClause(CKind);
29282918
HasImplicitClause = false;
2929-
OMPClause *Clause = ParseOpenMPClause(
2930-
DKind, CKind, !FirstClauses[unsigned(CKind)].getInt());
2931-
FirstClauses[unsigned(CKind)].setInt(true);
2932-
if (Clause) {
2933-
FirstClauses[unsigned(CKind)].setPointer(Clause);
2919+
OMPClause *Clause =
2920+
ParseOpenMPClause(DKind, CKind, !SeenClauses[unsigned(CKind)]);
2921+
SeenClauses[unsigned(CKind)] = true;
2922+
if (Clause)
29342923
Clauses.push_back(Clause);
2935-
}
29362924

29372925
// Skip ',' if any.
29382926
if (Tok.is(tok::comma))
@@ -2948,7 +2936,7 @@ StmtResult Parser::ParseOpenMPDeclarativeOrExecutableDirective(
29482936
// If the depend or doacross clause is specified, the ordered construct
29492937
// is a stand-alone directive.
29502938
for (auto CK : {OMPC_depend, OMPC_doacross}) {
2951-
if (FirstClauses[unsigned(CK)].getInt()) {
2939+
if (SeenClauses[unsigned(CK)]) {
29522940
if ((StmtCtx & ParsedStmtContext::AllowStandaloneOpenMPDirectives) ==
29532941
ParsedStmtContext()) {
29542942
Diag(Loc, diag::err_omp_immediate_directive)
@@ -2960,7 +2948,7 @@ StmtResult Parser::ParseOpenMPDeclarativeOrExecutableDirective(
29602948
}
29612949
}
29622950

2963-
if (DKind == OMPD_tile && !FirstClauses[unsigned(OMPC_sizes)].getInt()) {
2951+
if (DKind == OMPD_tile && !SeenClauses[unsigned(OMPC_sizes)]) {
29642952
Diag(Loc, diag::err_omp_required_clause)
29652953
<< getOpenMPDirectiveName(OMPD_tile) << "sizes";
29662954
}

clang/lib/Sema/SemaBase.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ SemaBase::ImmediateDiagBuilder::~ImmediateDiagBuilder() {
2929
SemaRef.EmitCurrentDiagnostic(DiagID);
3030
}
3131

32+
PartialDiagnostic SemaBase::PDiag(unsigned DiagID) {
33+
return PartialDiagnostic(DiagID, SemaRef.Context.getDiagAllocator());
34+
}
35+
3236
const SemaBase::SemaDiagnosticBuilder &
3337
operator<<(const SemaBase::SemaDiagnosticBuilder &Diag,
3438
const PartialDiagnostic &PD) {

0 commit comments

Comments
 (0)