Skip to content

Commit 2283349

Browse files
committed
Merge remote-tracking branch 'upstream/main' into delayed_privatization_15
2 parents 1692791 + 3385616 commit 2283349

File tree

444 files changed

+11169
-7157
lines changed

Some content is hidden

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

444 files changed

+11169
-7157
lines changed

.ci/generate-buildkite-pipeline-premerge

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ function add-dependencies() {
9191
echo "${project}"
9292
case ${project} in
9393
bolt)
94-
for p in lld llvm; do
94+
for p in clang lld llvm; do
9595
echo $p
9696
done
9797
;;

bolt/include/bolt/Rewrite/RewriteInstance.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -424,6 +424,7 @@ class RewriteInstance {
424424

425425
/// Common section names.
426426
static StringRef getEHFrameSectionName() { return ".eh_frame"; }
427+
static StringRef getEHFrameHdrSectionName() { return ".eh_frame_hdr"; }
427428
static StringRef getRelaDynSectionName() { return ".rela.dyn"; }
428429

429430
/// FILE symbol name used for local fragments of global functions.

bolt/lib/Rewrite/RewriteInstance.cpp

Lines changed: 66 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1725,12 +1725,6 @@ void RewriteInstance::adjustFunctionBoundaries() {
17251725
if (!Function.isSymbolValidInScope(Symbol, SymbolSize))
17261726
break;
17271727

1728-
// Ignore unnamed symbols. Used, for example, by debugging info on RISC-V.
1729-
if (BC->isRISCV() && cantFail(Symbol.getName()).empty()) {
1730-
++NextSymRefI;
1731-
continue;
1732-
}
1733-
17341728
// Skip basic block labels. This happens on RISC-V with linker relaxation
17351729
// enabled because every branch needs a relocation and corresponding
17361730
// symbol. We don't want to add such symbols as entry points.
@@ -3932,11 +3926,6 @@ void RewriteInstance::patchELFPHDRTable() {
39323926

39333927
OS.seek(PHDRTableOffset);
39343928

3935-
bool ModdedGnuStack = false;
3936-
(void)ModdedGnuStack;
3937-
bool AddedSegment = false;
3938-
(void)AddedSegment;
3939-
39403929
auto createNewTextPhdr = [&]() {
39413930
ELF64LEPhdrTy NewPhdr;
39423931
NewPhdr.p_type = ELF::PT_LOAD;
@@ -3952,40 +3941,53 @@ void RewriteInstance::patchELFPHDRTable() {
39523941
NewPhdr.p_filesz = NewTextSegmentSize;
39533942
NewPhdr.p_memsz = NewTextSegmentSize;
39543943
NewPhdr.p_flags = ELF::PF_X | ELF::PF_R;
3955-
// FIXME: Currently instrumentation is experimental and the runtime data
3956-
// is emitted with code, thus everything needs to be writable
3957-
if (opts::Instrument)
3944+
if (opts::Instrument) {
3945+
// FIXME: Currently instrumentation is experimental and the runtime data
3946+
// is emitted with code, thus everything needs to be writable.
39583947
NewPhdr.p_flags |= ELF::PF_W;
3948+
}
39593949
NewPhdr.p_align = BC->PageAlign;
39603950

39613951
return NewPhdr;
39623952
};
39633953

3964-
auto createNewWritableSectionsPhdr = [&]() {
3965-
ELF64LEPhdrTy NewPhdr;
3966-
NewPhdr.p_type = ELF::PT_LOAD;
3967-
NewPhdr.p_offset = getFileOffsetForAddress(NewWritableSegmentAddress);
3968-
NewPhdr.p_vaddr = NewWritableSegmentAddress;
3969-
NewPhdr.p_paddr = NewWritableSegmentAddress;
3970-
NewPhdr.p_filesz = NewWritableSegmentSize;
3971-
NewPhdr.p_memsz = NewWritableSegmentSize;
3972-
NewPhdr.p_align = BC->RegularPageSize;
3973-
NewPhdr.p_flags = ELF::PF_R | ELF::PF_W;
3974-
return NewPhdr;
3954+
auto writeNewSegmentPhdrs = [&]() {
3955+
ELF64LE::Phdr NewTextPhdr = createNewTextPhdr();
3956+
OS.write(reinterpret_cast<const char *>(&NewTextPhdr), sizeof(NewTextPhdr));
3957+
3958+
if (NewWritableSegmentSize) {
3959+
ELF64LEPhdrTy NewPhdr;
3960+
NewPhdr.p_type = ELF::PT_LOAD;
3961+
NewPhdr.p_offset = getFileOffsetForAddress(NewWritableSegmentAddress);
3962+
NewPhdr.p_vaddr = NewWritableSegmentAddress;
3963+
NewPhdr.p_paddr = NewWritableSegmentAddress;
3964+
NewPhdr.p_filesz = NewWritableSegmentSize;
3965+
NewPhdr.p_memsz = NewWritableSegmentSize;
3966+
NewPhdr.p_align = BC->RegularPageSize;
3967+
NewPhdr.p_flags = ELF::PF_R | ELF::PF_W;
3968+
OS.write(reinterpret_cast<const char *>(&NewPhdr), sizeof(NewPhdr));
3969+
}
39753970
};
39763971

3972+
bool ModdedGnuStack = false;
3973+
bool AddedSegment = false;
3974+
39773975
// Copy existing program headers with modifications.
39783976
for (const ELF64LE::Phdr &Phdr : cantFail(Obj.program_headers())) {
39793977
ELF64LE::Phdr NewPhdr = Phdr;
3980-
if (PHDRTableAddress && Phdr.p_type == ELF::PT_PHDR) {
3981-
NewPhdr.p_offset = PHDRTableOffset;
3982-
NewPhdr.p_vaddr = PHDRTableAddress;
3983-
NewPhdr.p_paddr = PHDRTableAddress;
3984-
NewPhdr.p_filesz = sizeof(NewPhdr) * Phnum;
3985-
NewPhdr.p_memsz = sizeof(NewPhdr) * Phnum;
3986-
} else if (Phdr.p_type == ELF::PT_GNU_EH_FRAME) {
3987-
ErrorOr<BinarySection &> EHFrameHdrSec =
3988-
BC->getUniqueSectionByName(getNewSecPrefix() + ".eh_frame_hdr");
3978+
switch (Phdr.p_type) {
3979+
case ELF::PT_PHDR:
3980+
if (PHDRTableAddress) {
3981+
NewPhdr.p_offset = PHDRTableOffset;
3982+
NewPhdr.p_vaddr = PHDRTableAddress;
3983+
NewPhdr.p_paddr = PHDRTableAddress;
3984+
NewPhdr.p_filesz = sizeof(NewPhdr) * Phnum;
3985+
NewPhdr.p_memsz = sizeof(NewPhdr) * Phnum;
3986+
}
3987+
break;
3988+
case ELF::PT_GNU_EH_FRAME: {
3989+
ErrorOr<BinarySection &> EHFrameHdrSec = BC->getUniqueSectionByName(
3990+
getNewSecPrefix() + getEHFrameHdrSectionName());
39893991
if (EHFrameHdrSec && EHFrameHdrSec->isAllocatable() &&
39903992
EHFrameHdrSec->isFinalized()) {
39913993
NewPhdr.p_offset = EHFrameHdrSec->getOutputFileOffset();
@@ -3994,37 +3996,36 @@ void RewriteInstance::patchELFPHDRTable() {
39943996
NewPhdr.p_filesz = EHFrameHdrSec->getOutputSize();
39953997
NewPhdr.p_memsz = EHFrameHdrSec->getOutputSize();
39963998
}
3997-
} else if (opts::UseGnuStack && Phdr.p_type == ELF::PT_GNU_STACK) {
3998-
NewPhdr = createNewTextPhdr();
3999-
ModdedGnuStack = true;
4000-
} else if (!opts::UseGnuStack && Phdr.p_type == ELF::PT_DYNAMIC) {
4001-
// Insert the new header before DYNAMIC.
4002-
ELF64LE::Phdr NewTextPhdr = createNewTextPhdr();
4003-
OS.write(reinterpret_cast<const char *>(&NewTextPhdr),
4004-
sizeof(NewTextPhdr));
4005-
if (NewWritableSegmentSize) {
4006-
ELF64LEPhdrTy NewWritablePhdr = createNewWritableSectionsPhdr();
4007-
OS.write(reinterpret_cast<const char *>(&NewWritablePhdr),
4008-
sizeof(NewWritablePhdr));
3999+
break;
4000+
}
4001+
case ELF::PT_GNU_STACK:
4002+
if (opts::UseGnuStack) {
4003+
// Overwrite the header with the new text segment header.
4004+
NewPhdr = createNewTextPhdr();
4005+
ModdedGnuStack = true;
40094006
}
4010-
AddedSegment = true;
4007+
break;
4008+
case ELF::PT_DYNAMIC:
4009+
if (!opts::UseGnuStack) {
4010+
// Insert new headers before DYNAMIC.
4011+
writeNewSegmentPhdrs();
4012+
AddedSegment = true;
4013+
}
4014+
break;
40114015
}
40124016
OS.write(reinterpret_cast<const char *>(&NewPhdr), sizeof(NewPhdr));
40134017
}
40144018

40154019
if (!opts::UseGnuStack && !AddedSegment) {
4016-
// Append the new header to the end of the table.
4017-
ELF64LE::Phdr NewTextPhdr = createNewTextPhdr();
4018-
OS.write(reinterpret_cast<const char *>(&NewTextPhdr), sizeof(NewTextPhdr));
4019-
if (NewWritableSegmentSize) {
4020-
ELF64LEPhdrTy NewWritablePhdr = createNewWritableSectionsPhdr();
4021-
OS.write(reinterpret_cast<const char *>(&NewWritablePhdr),
4022-
sizeof(NewWritablePhdr));
4023-
}
4020+
// Append new headers to the end of the table.
4021+
writeNewSegmentPhdrs();
40244022
}
40254023

4026-
assert((!opts::UseGnuStack || ModdedGnuStack) &&
4027-
"could not find GNU_STACK program header to modify");
4024+
if (opts::UseGnuStack && !ModdedGnuStack) {
4025+
BC->errs()
4026+
<< "BOLT-ERROR: could not find PT_GNU_STACK program header to modify\n";
4027+
exit(1);
4028+
}
40284029
}
40294030

40304031
namespace {
@@ -5698,7 +5699,8 @@ void RewriteInstance::writeEHFrameHeader() {
56985699
BC->AsmInfo->getCodePointerSize()));
56995700
check_error(std::move(Er), "failed to parse EH frame");
57005701

5701-
LLVM_DEBUG(dbgs() << "BOLT: writing a new .eh_frame_hdr\n");
5702+
LLVM_DEBUG(dbgs() << "BOLT: writing a new " << getEHFrameHdrSectionName()
5703+
<< '\n');
57025704

57035705
NextAvailableAddress =
57045706
appendPadding(Out->os(), NextAvailableAddress, EHFrameHdrAlign);
@@ -5716,16 +5718,17 @@ void RewriteInstance::writeEHFrameHeader() {
57165718
const unsigned Flags = BinarySection::getFlags(/*IsReadOnly=*/true,
57175719
/*IsText=*/false,
57185720
/*IsAllocatable=*/true);
5719-
BinarySection *OldEHFrameHdrSection = getSection(".eh_frame_hdr");
5721+
BinarySection *OldEHFrameHdrSection = getSection(getEHFrameHdrSectionName());
57205722
if (OldEHFrameHdrSection)
5721-
OldEHFrameHdrSection->setOutputName(getOrgSecPrefix() + ".eh_frame_hdr");
5723+
OldEHFrameHdrSection->setOutputName(getOrgSecPrefix() +
5724+
getEHFrameHdrSectionName());
57225725

57235726
BinarySection &EHFrameHdrSec = BC->registerOrUpdateSection(
5724-
getNewSecPrefix() + ".eh_frame_hdr", ELF::SHT_PROGBITS, Flags, nullptr,
5725-
NewEHFrameHdr.size(), /*Alignment=*/1);
5727+
getNewSecPrefix() + getEHFrameHdrSectionName(), ELF::SHT_PROGBITS, Flags,
5728+
nullptr, NewEHFrameHdr.size(), /*Alignment=*/1);
57265729
EHFrameHdrSec.setOutputFileOffset(EHFrameHdrFileOffset);
57275730
EHFrameHdrSec.setOutputAddress(EHFrameHdrOutputAddress);
5728-
EHFrameHdrSec.setOutputName(".eh_frame_hdr");
5731+
EHFrameHdrSec.setOutputName(getEHFrameHdrSectionName());
57295732

57305733
NextAvailableAddress += EHFrameHdrSec.getOutputSize();
57315734

bolt/test/RISCV/unnamed-sym-no-entry.c renamed to bolt/test/RISCV/fake-label-no-entry.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@
55

66
// RUN: %clang %cflags -g -Wl,-q -o %t %s
77

8-
/// Verify that the binary indeed contains an unnamed symbol at _start
8+
/// Verify that the binary indeed contains a fake label ".L0 " at _start.
99
// RUN: llvm-readelf -s %t | FileCheck %s --check-prefix=CHECK-ELF
1010
// CHECK-ELF-DAG: [[#%x,START:]] {{.*}} FUNC GLOBAL DEFAULT [[#%d,SECTION:]] _start{{$}}
1111
// CHECK-ELF-DAG: [[#%x,START]] {{.*}} NOTYPE LOCAL DEFAULT [[#SECTION]] .L0 {{$}}
1212

13-
/// Verify that BOLT did not create an extra entry point for the unnamed symbol
13+
/// Verify that BOLT did not create an extra entry point for the fake label.
1414
// RUN: llvm-bolt -o %t.bolt %t --print-cfg | FileCheck %s
1515
// CHECK: Binary Function "_start" after building cfg {
1616
// CHECK: IsMultiEntry: 0

clang-tools-extra/clang-tidy/bugprone/EasilySwappableParametersCheck.cpp

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -967,7 +967,8 @@ approximateStandardConversionSequence(const TheCheck &Check, QualType From,
967967
// Get out the qualifiers of the original type. This will always be
968968
// re-applied to the WorkType to ensure it is the same qualification as the
969969
// original From was.
970-
auto QualifiersToApply = From.split().Quals.getAsOpaqueValue();
970+
auto FastQualifiersToApply = static_cast<unsigned>(
971+
From.split().Quals.getAsOpaqueValue() & Qualifiers::FastMask);
971972

972973
// LValue->RValue is irrelevant for the check, because it is a thing to be
973974
// done at a call site, and will be performed if need be performed.
@@ -993,7 +994,7 @@ approximateStandardConversionSequence(const TheCheck &Check, QualType From,
993994
// "const double -> double".
994995
LLVM_DEBUG(llvm::dbgs()
995996
<< "--- approximateStdConv. Conversion between numerics.\n");
996-
WorkType = QualType{ToBuiltin, QualifiersToApply};
997+
WorkType = QualType{ToBuiltin, FastQualifiersToApply};
997998
}
998999

9991000
const auto *FromEnum = WorkType->getAs<EnumType>();
@@ -1002,7 +1003,7 @@ approximateStandardConversionSequence(const TheCheck &Check, QualType From,
10021003
// Unscoped enumerations (or enumerations in C) convert to numerics.
10031004
LLVM_DEBUG(llvm::dbgs()
10041005
<< "--- approximateStdConv. Unscoped enum to numeric.\n");
1005-
WorkType = QualType{ToBuiltin, QualifiersToApply};
1006+
WorkType = QualType{ToBuiltin, FastQualifiersToApply};
10061007
} else if (FromNumeric && ToEnum && ToEnum->isUnscopedEnumerationType()) {
10071008
// Numeric types convert to enumerations only in C.
10081009
if (Ctx.getLangOpts().CPlusPlus) {
@@ -1013,7 +1014,7 @@ approximateStandardConversionSequence(const TheCheck &Check, QualType From,
10131014

10141015
LLVM_DEBUG(llvm::dbgs()
10151016
<< "--- approximateStdConv. Numeric to unscoped enum.\n");
1016-
WorkType = QualType{ToEnum, QualifiersToApply};
1017+
WorkType = QualType{ToEnum, FastQualifiersToApply};
10171018
}
10181019

10191020
// Check for pointer conversions.
@@ -1022,14 +1023,14 @@ approximateStandardConversionSequence(const TheCheck &Check, QualType From,
10221023
if (FromPtr && ToPtr) {
10231024
if (ToPtr->isVoidPointerType()) {
10241025
LLVM_DEBUG(llvm::dbgs() << "--- approximateStdConv. To void pointer.\n");
1025-
WorkType = QualType{ToPtr, QualifiersToApply};
1026+
WorkType = QualType{ToPtr, FastQualifiersToApply};
10261027
}
10271028

10281029
const auto *FromRecordPtr = FromPtr->getPointeeCXXRecordDecl();
10291030
const auto *ToRecordPtr = ToPtr->getPointeeCXXRecordDecl();
10301031
if (isDerivedToBase(FromRecordPtr, ToRecordPtr)) {
10311032
LLVM_DEBUG(llvm::dbgs() << "--- approximateStdConv. Derived* to Base*\n");
1032-
WorkType = QualType{ToPtr, QualifiersToApply};
1033+
WorkType = QualType{ToPtr, FastQualifiersToApply};
10331034
}
10341035
}
10351036

@@ -1039,7 +1040,7 @@ approximateStandardConversionSequence(const TheCheck &Check, QualType From,
10391040
const auto *ToRecord = To->getAsCXXRecordDecl();
10401041
if (isDerivedToBase(FromRecord, ToRecord)) {
10411042
LLVM_DEBUG(llvm::dbgs() << "--- approximateStdConv. Derived To Base.\n");
1042-
WorkType = QualType{ToRecord->getTypeForDecl(), QualifiersToApply};
1043+
WorkType = QualType{ToRecord->getTypeForDecl(), FastQualifiersToApply};
10431044
}
10441045

10451046
if (Ctx.getLangOpts().CPlusPlus17 && FromPtr && ToPtr) {
@@ -1054,7 +1055,7 @@ approximateStandardConversionSequence(const TheCheck &Check, QualType From,
10541055
!ToFunctionPtr->hasNoexceptExceptionSpec()) {
10551056
LLVM_DEBUG(llvm::dbgs() << "--- approximateStdConv. noexcept function "
10561057
"pointer to non-noexcept.\n");
1057-
WorkType = QualType{ToPtr, QualifiersToApply};
1058+
WorkType = QualType{ToPtr, FastQualifiersToApply};
10581059
}
10591060
}
10601061

clang-tools-extra/docs/clang-tidy/checks/cert/env33-c.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,4 @@ but does not actually attempt to execute a command.
1010

1111
This check corresponds to the CERT C Coding Standard rule
1212
`ENV33-C. Do not call system()
13-
<https://www.securecoding.cert.org/confluence/pages/viewpage.action?pageId=2130132>`_.
13+
<https://www.securecoding.cert.org/confluence/display/c/ENV33-C.+Do+not+call+system()>`_.

clang-tools-extra/test/pp-trace/pp-trace-pragma-general.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,12 @@ void foo() {
2121

2222
// CHECK: ---
2323
// CHECK-NEXT: - Callback: PragmaDirective
24+
// CHECK-NEXT: Loc: "<built-in>:{{.+}}:1"
25+
// CHECK-NEXT: Introducer: PIK_HashPragma
26+
// CHECK-NEXT: - Callback: PragmaDirective
27+
// CHECK-NEXT: Loc: "<built-in>:{{.+}}:1"
28+
// CHECK-NEXT: Introducer: PIK_HashPragma
29+
// CHECK-NEXT: - Callback: PragmaDirective
2430
// CHECK-NEXT: Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:3:1"
2531
// CHECK-NEXT: Introducer: PIK_HashPragma
2632
// CHECK-NEXT: - Callback: PragmaDiagnosticPush

clang-tools-extra/test/pp-trace/pp-trace-pragma-ms.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@
1818

1919
// CHECK: ---
2020
// CHECK-NEXT: - Callback: PragmaDirective
21+
// CHECK-NEXT: Loc: "<built-in>:{{.+}}:1"
22+
// CHECK-NEXT: Introducer: PIK_HashPragma
23+
// CHECK-NEXT: - Callback: PragmaDirective
24+
// CHECK-NEXT: Loc: "<built-in>:{{.+}}:1"
25+
// CHECK-NEXT: Introducer: PIK_HashPragma
26+
// CHECK-NEXT: - Callback: PragmaDirective
2127
// CHECK-NEXT: Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:3:1"
2228
// CHECK-NEXT: Introducer: PIK_HashPragma
2329
// CHECK-NEXT: - Callback: PragmaComment
@@ -67,7 +73,7 @@
6773
// CHECK-NEXT: Introducer: PIK_HashPragma
6874
// CHECK-NEXT: - Callback: PragmaMessage
6975
// CHECK-NEXT: Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:13:9"
70-
// CHECK-NEXT: Namespace:
76+
// CHECK-NEXT: Namespace:
7177
// CHECK-NEXT: Kind: PMK_Message
7278
// CHECK-NEXT: Str: message argument
7379
// CHECK-NEXT: - Callback: PragmaDirective

clang-tools-extra/test/pp-trace/pp-trace-pragma-opencl.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,12 @@
66

77
// CHECK: ---
88
// CHECK-NEXT: - Callback: PragmaDirective
9+
// CHECK-NEXT: Loc: "<built-in>:{{.+}}:1"
10+
// CHECK-NEXT: Introducer: PIK_HashPragma
11+
// CHECK-NEXT: - Callback: PragmaDirective
12+
// CHECK-NEXT: Loc: "<built-in>:{{.+}}:1"
13+
// CHECK-NEXT: Introducer: PIK_HashPragma
14+
// CHECK-NEXT: - Callback: PragmaDirective
915
// CHECK-NEXT: Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:3:1"
1016
// CHECK-NEXT: Introducer: PIK_HashPragma
1117
// CHECK-NEXT: - Callback: PragmaOpenCLExtension

clang/docs/LanguageExtensions.rst

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5572,3 +5572,25 @@ but the expression has no runtime effects.
55725572
Type- and value-dependent expressions are not supported yet.
55735573
55745574
This facility is designed to aid with testing name lookup machinery.
5575+
5576+
Predefined Macros
5577+
=================
5578+
5579+
`__GCC_DESTRUCTIVE_SIZE` and `__GCC_CONSTRUCTIVE_SIZE`
5580+
------------------------------------------------------
5581+
Specify the mimum offset between two objects to avoid false sharing and the
5582+
maximum size of contiguous memory to promote true sharing, respectively. These
5583+
macros are predefined in all C and C++ language modes, but can be redefined on
5584+
the command line with ``-D`` to specify different values as needed or can be
5585+
undefined on the command line with ``-U`` to disable support for the feature.
5586+
5587+
**Note: the values the macros expand to are not guaranteed to be stable. They
5588+
are are affected by architectures and CPU tuning flags, can change between
5589+
releases of Clang and will not match the values defined by other compilers such
5590+
as GCC.**
5591+
5592+
Compiling different TUs depending on these flags (including use of
5593+
``std::hardware_constructive_interference`` or
5594+
``std::hardware_destructive_interference``) with different compilers, macro
5595+
definitions, or architecture flags will lead to ODR violations and should be
5596+
avoided.

clang/docs/OpenMPSupport.rst

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,9 @@ implementation.
310310
+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
311311
| misc | dispatch construct and function variant argument adjustment | :part:`worked on` | D99537, D99679 |
312312
+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
313-
| misc | assume and assumes directives | :part:`worked on` | |
313+
| misc | assumes directives | :part:`worked on` | |
314+
+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
315+
| misc | assume directive | :part:`worked on` | |
314316
+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
315317
| misc | nothing directive | :good:`done` | D123286 |
316318
+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+

0 commit comments

Comments
 (0)