Skip to content

Commit d4a3b12

Browse files
authored
merge main into amd-staging (llvm#1675)
2 parents 9e5bbc7 + 9dbafb7 commit d4a3b12

File tree

154 files changed

+4580
-1130
lines changed

Some content is hidden

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

154 files changed

+4580
-1130
lines changed

.github/workflows/libcxx-build-and-test.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,8 @@ jobs:
216216
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
217217
- uses: maxim-lobanov/setup-xcode@60606e260d2fc5762a71e64e74b2174e8ea3c8bd # v1.6.0
218218
with:
219-
xcode-version: 'latest'
219+
# https://github.com/actions/runner-images/blob/main/images/macos/macos-15-Readme.md
220+
xcode-version: '16.3'
220221
- uses: seanmiddleditch/gha-setup-ninja@3b1f8f94a2f8254bd26914c4ab9474d4f0015f67 # v6
221222
- name: Build and test
222223
run: |

bolt/lib/Core/Relocation.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ static bool isSupportedAArch64(uint32_t Type) {
9696
case ELF::R_AARCH64_MOVW_UABS_G2:
9797
case ELF::R_AARCH64_MOVW_UABS_G2_NC:
9898
case ELF::R_AARCH64_MOVW_UABS_G3:
99+
case ELF::R_AARCH64_PLT32:
99100
return true;
100101
}
101102
}
@@ -202,6 +203,7 @@ static size_t getSizeForTypeAArch64(uint32_t Type) {
202203
case ELF::R_AARCH64_MOVW_UABS_G2_NC:
203204
case ELF::R_AARCH64_MOVW_UABS_G3:
204205
case ELF::R_AARCH64_ABS32:
206+
case ELF::R_AARCH64_PLT32:
205207
return 4;
206208
case ELF::R_AARCH64_ABS64:
207209
case ELF::R_AARCH64_PREL64:
@@ -354,6 +356,7 @@ static uint64_t extractValueAArch64(uint32_t Type, uint64_t Contents,
354356
case ELF::R_AARCH64_PREL16:
355357
return static_cast<int64_t>(PC) + SignExtend64<16>(Contents & 0xffff);
356358
case ELF::R_AARCH64_PREL32:
359+
case ELF::R_AARCH64_PLT32:
357360
return static_cast<int64_t>(PC) + SignExtend64<32>(Contents & 0xffffffff);
358361
case ELF::R_AARCH64_PREL64:
359362
return static_cast<int64_t>(PC) + Contents;
@@ -676,6 +679,7 @@ static bool isPCRelativeAArch64(uint32_t Type) {
676679
case ELF::R_AARCH64_PREL16:
677680
case ELF::R_AARCH64_PREL32:
678681
case ELF::R_AARCH64_PREL64:
682+
case ELF::R_AARCH64_PLT32:
679683
return true;
680684
}
681685
}

bolt/lib/Rewrite/RewriteInstance.cpp

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2603,7 +2603,9 @@ void RewriteInstance::readRelocations(const SectionRef &Section) {
26032603
void RewriteInstance::handleRelocation(const SectionRef &RelocatedSection,
26042604
const RelocationRef &Rel) {
26052605
const bool IsAArch64 = BC->isAArch64();
2606+
const bool IsX86 = BC->isX86();
26062607
const bool IsFromCode = RelocatedSection.isText();
2608+
const bool IsWritable = BinarySection(*BC, RelocatedSection).isWritable();
26072609

26082610
SmallString<16> TypeName;
26092611
Rel.getTypeName(TypeName);
@@ -2612,15 +2614,15 @@ void RewriteInstance::handleRelocation(const SectionRef &RelocatedSection,
26122614
return;
26132615

26142616
// Adjust the relocation type as the linker might have skewed it.
2615-
if (BC->isX86() && (RType & ELF::R_X86_64_converted_reloc_bit)) {
2617+
if (IsX86 && (RType & ELF::R_X86_64_converted_reloc_bit)) {
26162618
if (opts::Verbosity >= 1)
26172619
dbgs() << "BOLT-WARNING: ignoring R_X86_64_converted_reloc_bit\n";
26182620
RType &= ~ELF::R_X86_64_converted_reloc_bit;
26192621
}
26202622

26212623
if (Relocation::isTLS(RType)) {
26222624
// No special handling required for TLS relocations on X86.
2623-
if (BC->isX86())
2625+
if (IsX86)
26242626
return;
26252627

26262628
// The non-got related TLS relocations on AArch64 and RISC-V also could be
@@ -2661,6 +2663,30 @@ void RewriteInstance::handleRelocation(const SectionRef &RelocatedSection,
26612663
return;
26622664
}
26632665

2666+
if (!IsFromCode && !IsWritable && (IsX86 || IsAArch64) &&
2667+
Relocation::isPCRelative(RType)) {
2668+
BinaryData *BD = BC->getBinaryDataContainingAddress(Rel.getOffset());
2669+
if (BD && (BD->nameStartsWith("_ZTV") || // vtable
2670+
BD->nameStartsWith("_ZTCN"))) { // construction vtable
2671+
BinaryFunction *BF = BC->getBinaryFunctionContainingAddress(
2672+
SymbolAddress, /*CheckPastEnd*/ false, /*UseMaxSize*/ true);
2673+
if (!BF || BF->getAddress() != SymbolAddress) {
2674+
BC->errs()
2675+
<< "BOLT-ERROR: the virtual function table entry at offset 0x"
2676+
<< Twine::utohexstr(Rel.getOffset());
2677+
if (BF)
2678+
BC->errs() << " points to the middle of a function @ 0x"
2679+
<< Twine::utohexstr(BF->getAddress()) << "\n";
2680+
else
2681+
BC->errs() << " does not point to any function\n";
2682+
exit(1);
2683+
}
2684+
BC->addRelocation(Rel.getOffset(), BF->getSymbol(), RType, Addend,
2685+
ExtractedValue);
2686+
return;
2687+
}
2688+
}
2689+
26642690
const uint64_t Address = SymbolAddress + Addend;
26652691

26662692
LLVM_DEBUG({
@@ -2724,7 +2750,7 @@ void RewriteInstance::handleRelocation(const SectionRef &RelocatedSection,
27242750
const bool IsToCode = ReferencedSection && ReferencedSection->isText();
27252751

27262752
// Special handling of PC-relative relocations.
2727-
if (BC->isX86() && Relocation::isPCRelative(RType)) {
2753+
if (IsX86 && Relocation::isPCRelative(RType)) {
27282754
if (!IsFromCode && IsToCode) {
27292755
// PC-relative relocations from data to code are tricky since the
27302756
// original information is typically lost after linking, even with
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
// Test BOLT is able to handle relative virtual function table, i.e., when
2+
// code is compiled with `-fexperimental-relative-c++-abi-vtables`.
3+
4+
// REQUIRES: system-linux
5+
6+
// RUN: split-file %s %t
7+
// RUN: %clang -fuse-ld=lld -o %t/main.so %t/tt.cpp %t/main.cpp -Wl,-q \
8+
// RUN: -fno-rtti -fexperimental-relative-c++-abi-vtables
9+
// RUN: %t/main.so | FileCheck %s
10+
11+
// CHECK: derived_foo
12+
// CHECK-NEXT: derived_bar
13+
// CHECK-NEXT: derived_goo
14+
15+
// RUN: llvm-bolt %t/main.so -o %t/main.bolted.so --trap-old-code
16+
// RUN: %t/main.bolted.so | FileCheck %s
17+
18+
;--- tt.h
19+
#include <stdio.h>
20+
21+
class Base {
22+
public:
23+
virtual void foo();
24+
virtual void bar();
25+
virtual void goo();
26+
};
27+
28+
class Derived : public Base {
29+
public:
30+
virtual void foo() override;
31+
virtual void bar() override;
32+
virtual void goo() override;
33+
};
34+
35+
;--- tt.cpp
36+
#include "tt.h"
37+
void Derived::goo() { printf("derived_goo\n"); }
38+
39+
;--- main.cpp
40+
#include "tt.h"
41+
#pragma clang optimize off
42+
43+
void Base::foo() { printf("base_foo\n"); }
44+
void Base::bar() { printf("base_bar\n"); }
45+
void Base::goo() { printf("base_goo\n"); }
46+
47+
void Derived::foo() { printf("derived_foo\n"); }
48+
void Derived::bar() { printf("derived_bar\n"); }
49+
50+
int main() {
51+
Derived D;
52+
Base *ptr = &D;
53+
ptr->foo();
54+
ptr->bar();
55+
ptr->goo();
56+
return 0;
57+
}

clang-tools-extra/clang-tidy/readability/StaticAccessedThroughInstanceCheck.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ void StaticAccessedThroughInstanceCheck::check(
6969
PrintingPolicyWithSuppressedTag.SuppressTagKeyword = true;
7070
PrintingPolicyWithSuppressedTag.SuppressUnwrittenScope = true;
7171

72-
PrintingPolicyWithSuppressedTag.PrintCanonicalTypes =
72+
PrintingPolicyWithSuppressedTag.PrintAsCanonical =
7373
!BaseExpr->getType()->isTypedefNameType();
7474

7575
std::string BaseTypeName =

clang-tools-extra/clang-tidy/utils/Matchers.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ bool MatchesAnyListedTypeNameMatcher::matches(
3333

3434
PrintingPolicy PrintingPolicyWithSuppressedTag(
3535
Finder->getASTContext().getLangOpts());
36-
PrintingPolicyWithSuppressedTag.PrintCanonicalTypes = CanonicalTypes;
36+
PrintingPolicyWithSuppressedTag.PrintAsCanonical = CanonicalTypes;
3737
PrintingPolicyWithSuppressedTag.SuppressElaboration = true;
3838
PrintingPolicyWithSuppressedTag.SuppressScope = false;
3939
PrintingPolicyWithSuppressedTag.SuppressTagKeyword = true;

clang/include/clang/AST/PrettyPrinter.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ struct PrintingPolicy {
7676
MSWChar(LO.MicrosoftExt && !LO.WChar), IncludeNewlines(true),
7777
MSVCFormatting(false), ConstantsAsWritten(false),
7878
SuppressImplicitBase(false), FullyQualifiedName(false),
79-
PrintCanonicalTypes(false), PrintInjectedClassNameWithArguments(true),
79+
PrintAsCanonical(false), PrintInjectedClassNameWithArguments(true),
8080
UsePreferredNames(true), AlwaysIncludeTypeForTemplateArgument(false),
8181
CleanUglifiedParameters(false), EntireContentsOfLargeArray(true),
8282
UseEnumerators(true), UseHLSLTypes(LO.HLSL) {}
@@ -310,9 +310,9 @@ struct PrintingPolicy {
310310
LLVM_PREFERRED_TYPE(bool)
311311
unsigned FullyQualifiedName : 1;
312312

313-
/// Whether to print types as written or canonically.
313+
/// Whether to print entities as written or canonically.
314314
LLVM_PREFERRED_TYPE(bool)
315-
unsigned PrintCanonicalTypes : 1;
315+
unsigned PrintAsCanonical : 1;
316316

317317
/// Whether to print an InjectedClassNameType with template arguments or as
318318
/// written. When a template argument is unnamed, printing it results in

clang/lib/AST/DeclPrinter.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -735,7 +735,7 @@ void DeclPrinter::VisitFunctionDecl(FunctionDecl *D) {
735735
llvm::raw_string_ostream POut(Proto);
736736
DeclPrinter TArgPrinter(POut, SubPolicy, Context, Indentation);
737737
const auto *TArgAsWritten = D->getTemplateSpecializationArgsAsWritten();
738-
if (TArgAsWritten && !Policy.PrintCanonicalTypes)
738+
if (TArgAsWritten && !Policy.PrintAsCanonical)
739739
TArgPrinter.printTemplateArguments(TArgAsWritten->arguments(), nullptr);
740740
else if (const TemplateArgumentList *TArgs =
741741
D->getTemplateSpecializationArgs())
@@ -1124,7 +1124,7 @@ void DeclPrinter::VisitCXXRecordDecl(CXXRecordDecl *D) {
11241124
S->getSpecializedTemplate()->getTemplateParameters();
11251125
const ASTTemplateArgumentListInfo *TArgAsWritten =
11261126
S->getTemplateArgsAsWritten();
1127-
if (TArgAsWritten && !Policy.PrintCanonicalTypes)
1127+
if (TArgAsWritten && !Policy.PrintAsCanonical)
11281128
printTemplateArguments(TArgAsWritten->arguments(), TParams);
11291129
else
11301130
printTemplateArguments(S->getTemplateArgs().asArray(), TParams);

clang/lib/AST/JSONNodeDumper.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1724,6 +1724,8 @@ void JSONNodeDumper::VisitTemplateExpansionTemplateArgument(
17241724
void JSONNodeDumper::VisitExpressionTemplateArgument(
17251725
const TemplateArgument &TA) {
17261726
JOS.attribute("isExpr", true);
1727+
if (TA.isCanonicalExpr())
1728+
JOS.attribute("isCanonical", true);
17271729
}
17281730
void JSONNodeDumper::VisitPackTemplateArgument(const TemplateArgument &TA) {
17291731
JOS.attribute("isPack", true);

clang/lib/AST/StmtPrinter.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1305,9 +1305,13 @@ void StmtPrinter::VisitDeclRefExpr(DeclRefExpr *Node) {
13051305
Qualifier->print(OS, Policy);
13061306
if (Node->hasTemplateKeyword())
13071307
OS << "template ";
1308+
1309+
bool ForceAnonymous =
1310+
Policy.PrintAsCanonical && VD->getKind() == Decl::NonTypeTemplateParm;
13081311
DeclarationNameInfo NameInfo = Node->getNameInfo();
13091312
if (IdentifierInfo *ID = NameInfo.getName().getAsIdentifierInfo();
1310-
ID || NameInfo.getName().getNameKind() != DeclarationName::Identifier) {
1313+
!ForceAnonymous &&
1314+
(ID || NameInfo.getName().getNameKind() != DeclarationName::Identifier)) {
13111315
if (Policy.CleanUglifiedParameters &&
13121316
isa<ParmVarDecl, NonTypeTemplateParmDecl>(VD) && ID)
13131317
OS << ID->deuglifiedName();

clang/lib/AST/TemplateBase.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -559,9 +559,12 @@ void TemplateArgument::print(const PrintingPolicy &Policy, raw_ostream &Out,
559559
printIntegral(*this, Out, Policy, IncludeType);
560560
break;
561561

562-
case Expression:
563-
getAsExpr()->printPretty(Out, nullptr, Policy);
562+
case Expression: {
563+
PrintingPolicy ExprPolicy = Policy;
564+
ExprPolicy.PrintAsCanonical = isCanonicalExpr();
565+
getAsExpr()->printPretty(Out, nullptr, ExprPolicy);
564566
break;
567+
}
565568

566569
case Pack:
567570
Out << "<";

clang/lib/AST/TemplateName.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -410,9 +410,9 @@ bool TemplateName::containsUnexpandedParameterPack() const {
410410

411411
void TemplateName::print(raw_ostream &OS, const PrintingPolicy &Policy,
412412
Qualified Qual) const {
413-
auto handleAnonymousTTP = [](TemplateDecl *TD, raw_ostream &OS) {
413+
auto handleAnonymousTTP = [&](TemplateDecl *TD, raw_ostream &OS) {
414414
if (TemplateTemplateParmDecl *TTP = dyn_cast<TemplateTemplateParmDecl>(TD);
415-
TTP && TTP->getIdentifier() == nullptr) {
415+
TTP && (Policy.PrintAsCanonical || TTP->getIdentifier() == nullptr)) {
416416
OS << "template-parameter-" << TTP->getDepth() << "-" << TTP->getIndex();
417417
return true;
418418
}
@@ -430,13 +430,19 @@ void TemplateName::print(raw_ostream &OS, const PrintingPolicy &Policy,
430430
// names more often than to export them, thus using the original name is
431431
// most useful in this case.
432432
TemplateDecl *Template = getAsTemplateDecl();
433+
if (Policy.PrintAsCanonical)
434+
Template = cast<TemplateDecl>(Template->getCanonicalDecl());
433435
if (handleAnonymousTTP(Template, OS))
434436
return;
435437
if (Qual == Qualified::None)
436438
OS << *Template;
437439
else
438440
Template->printQualifiedName(OS, Policy);
439441
} else if (QualifiedTemplateName *QTN = getAsQualifiedTemplateName()) {
442+
if (Policy.PrintAsCanonical) {
443+
QTN->getUnderlyingTemplate().print(OS, Policy, Qual);
444+
return;
445+
}
440446
if (NestedNameSpecifier *NNS = QTN->getQualifier();
441447
Qual != Qualified::None && NNS)
442448
NNS->print(OS, Policy);

clang/lib/AST/TextNodeDumper.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1357,6 +1357,8 @@ void TextNodeDumper::VisitTemplateExpansionTemplateArgument(
13571357
void TextNodeDumper::VisitExpressionTemplateArgument(
13581358
const TemplateArgument &TA) {
13591359
OS << " expr";
1360+
if (TA.isCanonicalExpr())
1361+
OS << " canonical";
13601362
dumpTemplateArgument(TA);
13611363
}
13621364

clang/lib/AST/TypePrinter.cpp

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ void TypePrinter::spaceBeforePlaceHolder(raw_ostream &OS) {
177177

178178
static SplitQualType splitAccordingToPolicy(QualType QT,
179179
const PrintingPolicy &Policy) {
180-
if (Policy.PrintCanonicalTypes)
180+
if (Policy.PrintAsCanonical)
181181
QT = QT.getCanonicalType();
182182
return QT.split();
183183
}
@@ -1273,8 +1273,11 @@ void TypePrinter::printTypeOfAfter(const TypeOfType *T, raw_ostream &OS) {}
12731273

12741274
void TypePrinter::printDecltypeBefore(const DecltypeType *T, raw_ostream &OS) {
12751275
OS << "decltype(";
1276-
if (T->getUnderlyingExpr())
1277-
T->getUnderlyingExpr()->printPretty(OS, nullptr, Policy);
1276+
if (const Expr *E = T->getUnderlyingExpr()) {
1277+
PrintingPolicy ExprPolicy = Policy;
1278+
ExprPolicy.PrintAsCanonical = T->isCanonicalUnqualified();
1279+
E->printPretty(OS, nullptr, ExprPolicy);
1280+
}
12781281
OS << ')';
12791282
spaceBeforePlaceHolder(OS);
12801283
}
@@ -1548,7 +1551,7 @@ void TypePrinter::printTag(TagDecl *D, raw_ostream &OS) {
15481551
const ASTTemplateArgumentListInfo *TArgAsWritten =
15491552
S->getTemplateArgsAsWritten();
15501553
IncludeStrongLifetimeRAII Strong(Policy);
1551-
if (TArgAsWritten && !Policy.PrintCanonicalTypes)
1554+
if (TArgAsWritten && !Policy.PrintAsCanonical)
15521555
printTemplateArgumentList(OS, TArgAsWritten->arguments(), Policy,
15531556
TParams);
15541557
else
@@ -2422,9 +2425,8 @@ static void
24222425
printTo(raw_ostream &OS, ArrayRef<TA> Args, const PrintingPolicy &Policy,
24232426
const TemplateParameterList *TPL, bool IsPack, unsigned ParmIndex) {
24242427
// Drop trailing template arguments that match default arguments.
2425-
if (TPL && Policy.SuppressDefaultTemplateArgs &&
2426-
!Policy.PrintCanonicalTypes && !Args.empty() && !IsPack &&
2427-
Args.size() <= TPL->size()) {
2428+
if (TPL && Policy.SuppressDefaultTemplateArgs && !Policy.PrintAsCanonical &&
2429+
!Args.empty() && !IsPack && Args.size() <= TPL->size()) {
24282430
llvm::SmallVector<TemplateArgument, 8> OrigArgs;
24292431
for (const TA &A : Args)
24302432
OrigArgs.push_back(getArgument(A));

clang/lib/CodeGen/CGDebugInfo.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ PrintingPolicy CGDebugInfo::getPrintingPolicy() const {
337337

338338
PP.SuppressInlineNamespace =
339339
PrintingPolicy::SuppressInlineNamespaceMode::None;
340-
PP.PrintCanonicalTypes = true;
340+
PP.PrintAsCanonical = true;
341341
PP.UsePreferredNames = false;
342342
PP.AlwaysIncludeTypeForTemplateArgument = true;
343343
PP.UseEnumerators = false;

clang/lib/CodeGen/TargetBuiltins/DirectX.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,17 @@ Value *CodeGenFunction::EmitDirectXBuiltinExpr(unsigned BuiltinID,
2525
case DirectX::BI__builtin_dx_dot2add: {
2626
Value *A = EmitScalarExpr(E->getArg(0));
2727
Value *B = EmitScalarExpr(E->getArg(1));
28-
Value *C = EmitScalarExpr(E->getArg(2));
28+
Value *Acc = EmitScalarExpr(E->getArg(2));
29+
30+
Value *AX = Builder.CreateExtractElement(A, Builder.getSize(0));
31+
Value *AY = Builder.CreateExtractElement(A, Builder.getSize(1));
32+
Value *BX = Builder.CreateExtractElement(B, Builder.getSize(0));
33+
Value *BY = Builder.CreateExtractElement(B, Builder.getSize(1));
2934

3035
Intrinsic::ID ID = llvm ::Intrinsic::dx_dot2add;
3136
return Builder.CreateIntrinsic(
32-
/*ReturnType=*/C->getType(), ID, ArrayRef<Value *>{A, B, C}, nullptr,
33-
"dx.dot2add");
37+
/*ReturnType=*/Acc->getType(), ID,
38+
ArrayRef<Value *>{Acc, AX, AY, BX, BY}, nullptr, "dx.dot2add");
3439
}
3540
}
3641
return nullptr;

clang/lib/Driver/ToolChains/HIPAMD.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,10 @@ void AMDGCN::Linker::constructLldCommand(Compilation &C, const JobAction &JA,
105105
// ToDo: Remove this option after AMDGPU backend supports ISA-level linking.
106106
// Since AMDGPU backend currently does not support ISA-level linking, all
107107
// called functions need to be imported.
108-
if (IsThinLTO)
108+
if (IsThinLTO) {
109109
LldArgs.push_back(Args.MakeArgString("-plugin-opt=-force-import-all"));
110+
LldArgs.push_back(Args.MakeArgString("-plugin-opt=-avail-extern-to-local"));
111+
}
110112

111113
if (Arg *A = Args.getLastArgNoClaim(options::OPT_g_Group))
112114
if (!A->getOption().matches(options::OPT_g0) &&

clang/lib/Sema/SemaTemplate.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3463,7 +3463,7 @@ Sema::findFailedBooleanCondition(Expr *Cond) {
34633463
{
34643464
llvm::raw_string_ostream Out(Description);
34653465
PrintingPolicy Policy = getPrintingPolicy();
3466-
Policy.PrintCanonicalTypes = true;
3466+
Policy.PrintAsCanonical = true;
34673467
FailedBooleanConditionPrinterHelper Helper(Policy);
34683468
FailedCond->printPretty(Out, &Helper, Policy, 0, "\n", nullptr);
34693469
}

0 commit comments

Comments
 (0)