Skip to content

Commit 7faae6d

Browse files
Merge remote-tracking branch 'upstream-llvm/release/18.x' into hrmny/merge-upstream
2 parents 7973f35 + 12a3bf3 commit 7faae6d

File tree

86 files changed

+1943
-335
lines changed

Some content is hidden

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

86 files changed

+1943
-335
lines changed

.github/workflows/llvm-project-tests.yml

+5
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,11 @@ jobs:
118118
else
119119
builddir="$(pwd)"/build
120120
fi
121+
if [ "${{ runner.os }}" == "macOS" ]; then
122+
# Workaround test failure on some lld tests on MacOS
123+
# https://github.com/llvm/llvm-project/issues/81967
124+
extra_cmake_args="-DLLVM_DISABLE_ASSEMBLY_FILES=ON"
125+
fi
121126
echo "llvm-builddir=$builddir" >> "$GITHUB_OUTPUT"
122127
cmake -G Ninja \
123128
-B "$builddir" \

clang-tools-extra/docs/ReleaseNotes.rst

+36-7
Original file line numberDiff line numberDiff line change
@@ -51,21 +51,35 @@ Improvements to clangd
5151
Inlay hints
5252
^^^^^^^^^^^
5353

54-
Diagnostics
55-
^^^^^^^^^^^
56-
57-
Semantic Highlighting
58-
^^^^^^^^^^^^^^^^^^^^^
54+
- Type hints
55+
* Improved heuristics for showing sugared vs. desguared types
56+
* Some hints which provide no information (e.g. ``<dependent-type>``) are now omitted
57+
- Parameter hints
58+
* Parameter hints are now shown for calls through function pointers
59+
* Parameter hints are now shown for calls to a class's ``operator()``
60+
* No longer show bogus parameter hints for some builtins like ``__builtin_dump_struct``
5961

6062
Compile flags
6163
^^^^^^^^^^^^^
6264

65+
- System include extractor (``--query-driver``) improvements
66+
* The directory containing builtin headers is now excluded from extracted system includes
67+
* Various flags which can affect the system includes (``--target``, ``--stdlib``, ``-specs``) are now forwarded to the driver
68+
* Fixed a bug where clangd would sometimes try to call a driver that didn't have obj-c support with ``-x objective-c++-header``
69+
* The driver path is now dot-normalized before being compared to the ``--query-driver`` pattern
70+
* ``--query-driver`` is now supported by ``clangd-indexer``
71+
- Fixed a regression in clangd 17 where response files would not be expanded
72+
6373
Hover
6474
^^^^^
6575

76+
- Hover now shows alignment info for fields and records
77+
6678
Code completion
6779
^^^^^^^^^^^^^^^
6880

81+
- Refined heuristics for determining whether the use of a function can be a call or not
82+
6983
Code actions
7084
^^^^^^^^^^^^
7185

@@ -75,15 +89,25 @@ Code actions
7589
Signature help
7690
^^^^^^^^^^^^^^
7791

92+
- Improved support for calls through function pointer types
93+
7894
Cross-references
7995
^^^^^^^^^^^^^^^^
8096

97+
- Improved support for C++20 concepts
98+
- Find-references now works for labels
99+
- Improvements to template heuristics
100+
81101
Objective-C
82102
^^^^^^^^^^^
83103

84104
Miscellaneous
85105
^^^^^^^^^^^^^
86106

107+
- Various stability improvements, e.g. crash fixes
108+
- Improved error recovery on invalid code
109+
- Clangd now bails gracefully on assembly and IR source files
110+
87111
Improvements to clang-doc
88112
-------------------------
89113

@@ -564,10 +588,15 @@ Changes in existing checks
564588
Removed checks
565589
^^^^^^^^^^^^^^
566590

567-
Improvements to include-fixer
591+
Improvements to include-cleaner
568592
-----------------------------
569593

570-
The improvements are...
594+
- Support for ``--only-headers`` flag to limit analysis to headers matching a regex
595+
- Recognizes references through ``concept``s
596+
- Builtin headers are not analyzed
597+
- Handling of references through ``friend`` declarations
598+
- Fixes around handling of IWYU pragmas on stdlib headers
599+
- Improved handling around references to/from template specializations
571600

572601
Improvements to clang-include-fixer
573602
-----------------------------------

clang/docs/ReleaseNotes.rst

+7
Original file line numberDiff line numberDiff line change
@@ -1103,6 +1103,8 @@ Bug Fixes to C++ Support
11031103
(`#82258 <https://github.com/llvm/llvm-project/issues/82258>`_)
11041104
- Correctly immediate-escalate lambda conversion functions.
11051105
(`#82258 <https://github.com/llvm/llvm-project/issues/82258>`_)
1106+
- Fix a crash when an unresolved overload set is encountered on the RHS of a ``.*`` operator.
1107+
(`#53815 <https://github.com/llvm/llvm-project/issues/53815>`_)
11061108

11071109
Bug Fixes to AST Handling
11081110
^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -1325,6 +1327,11 @@ AIX Support
13251327
or newer. Similar to the LTO support on AIX, ThinLTO is implemented with
13261328
the libLTO.so plugin.
13271329

1330+
SystemZ Support
1331+
^^^^^^^^^^^^^^^
1332+
- Properly support 16 byte atomic int/fp types and ops. Atomic __int128 (and
1333+
long double) variables are now aligned to 16 bytes by default (like gcc 14).
1334+
13281335
WebAssembly Support
13291336
^^^^^^^^^^^^^^^^^^^
13301337

clang/lib/CodeGen/BackendUtil.cpp

+16-16
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,14 @@ class EmitAssemblyHelper {
186186
TargetTriple.getVendor() != llvm::Triple::Apple;
187187
}
188188

189+
/// Check whether we should emit a flag for UnifiedLTO.
190+
/// The UnifiedLTO module flag should be set when UnifiedLTO is enabled for
191+
/// ThinLTO or Full LTO with module summaries.
192+
bool shouldEmitUnifiedLTOModueFlag() const {
193+
return CodeGenOpts.UnifiedLTO &&
194+
(CodeGenOpts.PrepareForThinLTO || shouldEmitRegularLTOSummary());
195+
}
196+
189197
public:
190198
EmitAssemblyHelper(DiagnosticsEngine &_Diags,
191199
const HeaderSearchOptions &HeaderSearchOpts,
@@ -1029,7 +1037,8 @@ void EmitAssemblyHelper::RunOptimizationPipeline(
10291037
if (!actionRequiresCodeGen(Action) && CodeGenOpts.VerifyModule)
10301038
MPM.addPass(VerifierPass());
10311039

1032-
if (Action == Backend_EmitBC || Action == Backend_EmitLL) {
1040+
if (Action == Backend_EmitBC || Action == Backend_EmitLL ||
1041+
CodeGenOpts.FatLTO) {
10331042
if (CodeGenOpts.PrepareForThinLTO && !CodeGenOpts.DisableLLVMPasses) {
10341043
if (!TheModule->getModuleFlag("EnableSplitLTOUnit"))
10351044
TheModule->addModuleFlag(llvm::Module::Error, "EnableSplitLTOUnit",
@@ -1040,11 +1049,9 @@ void EmitAssemblyHelper::RunOptimizationPipeline(
10401049
if (!ThinLinkOS)
10411050
return;
10421051
}
1043-
if (CodeGenOpts.UnifiedLTO)
1044-
TheModule->addModuleFlag(llvm::Module::Error, "UnifiedLTO", uint32_t(1));
10451052
MPM.addPass(ThinLTOBitcodeWriterPass(
10461053
*OS, ThinLinkOS ? &ThinLinkOS->os() : nullptr));
1047-
} else {
1054+
} else if (Action == Backend_EmitLL) {
10481055
MPM.addPass(PrintModulePass(*OS, "", CodeGenOpts.EmitLLVMUseLists,
10491056
/*EmitLTOSummary=*/true));
10501057
}
@@ -1058,24 +1065,17 @@ void EmitAssemblyHelper::RunOptimizationPipeline(
10581065
if (!TheModule->getModuleFlag("EnableSplitLTOUnit"))
10591066
TheModule->addModuleFlag(llvm::Module::Error, "EnableSplitLTOUnit",
10601067
uint32_t(1));
1061-
if (CodeGenOpts.UnifiedLTO)
1062-
TheModule->addModuleFlag(llvm::Module::Error, "UnifiedLTO", uint32_t(1));
10631068
}
1064-
if (Action == Backend_EmitBC)
1069+
if (Action == Backend_EmitBC) {
10651070
MPM.addPass(BitcodeWriterPass(*OS, CodeGenOpts.EmitLLVMUseLists,
10661071
EmitLTOSummary));
1067-
else
1072+
} else if (Action == Backend_EmitLL) {
10681073
MPM.addPass(PrintModulePass(*OS, "", CodeGenOpts.EmitLLVMUseLists,
10691074
EmitLTOSummary));
1075+
}
10701076
}
1071-
}
1072-
if (CodeGenOpts.FatLTO) {
1073-
// Set the EnableSplitLTOUnit and UnifiedLTO module flags, since FatLTO
1074-
// uses a different action than Backend_EmitBC or Backend_EmitLL.
1075-
if (!TheModule->getModuleFlag("EnableSplitLTOUnit"))
1076-
TheModule->addModuleFlag(llvm::Module::Error, "EnableSplitLTOUnit",
1077-
uint32_t(CodeGenOpts.EnableSplitLTOUnit));
1078-
if (CodeGenOpts.UnifiedLTO && !TheModule->getModuleFlag("UnifiedLTO"))
1077+
1078+
if (shouldEmitUnifiedLTOModueFlag())
10791079
TheModule->addModuleFlag(llvm::Module::Error, "UnifiedLTO", uint32_t(1));
10801080
}
10811081

clang/lib/Headers/larchintrin.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ extern __inline unsigned char
156156
return (unsigned char)__builtin_loongarch_iocsrrd_b((unsigned int)_1);
157157
}
158158

159-
extern __inline unsigned char
159+
extern __inline unsigned short
160160
__attribute__((__gnu_inline__, __always_inline__, __artificial__))
161161
__iocsrrd_h(unsigned int _1) {
162162
return (unsigned short)__builtin_loongarch_iocsrrd_h((unsigned int)_1);

clang/lib/Sema/SemaOverload.cpp

+17-5
Original file line numberDiff line numberDiff line change
@@ -14470,6 +14470,23 @@ ExprResult Sema::CreateOverloadedBinOp(SourceLocation OpLoc,
1447014470
CurFPFeatureOverrides());
1447114471
}
1447214472

14473+
// If this is the .* operator, which is not overloadable, just
14474+
// create a built-in binary operator.
14475+
if (Opc == BO_PtrMemD) {
14476+
auto CheckPlaceholder = [&](Expr *&Arg) {
14477+
ExprResult Res = CheckPlaceholderExpr(Arg);
14478+
if (Res.isUsable())
14479+
Arg = Res.get();
14480+
return !Res.isUsable();
14481+
};
14482+
14483+
// CreateBuiltinBinOp() doesn't like it if we tell it to create a '.*'
14484+
// expression that contains placeholders (in either the LHS or RHS).
14485+
if (CheckPlaceholder(Args[0]) || CheckPlaceholder(Args[1]))
14486+
return ExprError();
14487+
return CreateBuiltinBinOp(OpLoc, Opc, Args[0], Args[1]);
14488+
}
14489+
1447314490
// Always do placeholder-like conversions on the RHS.
1447414491
if (checkPlaceholderForOverload(*this, Args[1]))
1447514492
return ExprError();
@@ -14489,11 +14506,6 @@ ExprResult Sema::CreateOverloadedBinOp(SourceLocation OpLoc,
1448914506
if (Opc == BO_Assign && !Args[0]->getType()->isOverloadableType())
1449014507
return CreateBuiltinBinOp(OpLoc, Opc, Args[0], Args[1]);
1449114508

14492-
// If this is the .* operator, which is not overloadable, just
14493-
// create a built-in binary operator.
14494-
if (Opc == BO_PtrMemD)
14495-
return CreateBuiltinBinOp(OpLoc, Opc, Args[0], Args[1]);
14496-
1449714509
// Build the overload set.
1449814510
OverloadCandidateSet CandidateSet(OpLoc, OverloadCandidateSet::CSK_Operator,
1449914511
OverloadCandidateSet::OperatorRewriteInfo(

clang/lib/StaticAnalyzer/Core/CallEvent.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1409,7 +1409,7 @@ CallEventManager::getSimpleCall(const CallExpr *CE, ProgramStateRef State,
14091409
if (const auto *OpCE = dyn_cast<CXXOperatorCallExpr>(CE)) {
14101410
const FunctionDecl *DirectCallee = OpCE->getDirectCallee();
14111411
if (const auto *MD = dyn_cast<CXXMethodDecl>(DirectCallee))
1412-
if (MD->isInstance())
1412+
if (MD->isImplicitObjectMemberFunction())
14131413
return create<CXXMemberOperatorCall>(OpCE, State, LCtx, ElemRef);
14141414

14151415
} else if (CE->getCallee()->getType()->isBlockPointerType()) {

clang/test/Analysis/cxx2b-deducing-this.cpp

+11
Original file line numberDiff line numberDiff line change
@@ -60,3 +60,14 @@ void top() {
6060
s.c();
6161
s.c(11);
6262
}
63+
64+
65+
struct S2 {
66+
bool operator==(this auto, S2) {
67+
return true;
68+
}
69+
};
70+
void use_deducing_this() {
71+
int result = S2{} == S2{}; // no-crash
72+
clang_analyzer_dump(result); // expected-warning {{1 S32b}}
73+
}

clang/test/CodeGen/LoongArch/intrinsic-la32.c

+22-7
Original file line numberDiff line numberDiff line change
@@ -169,8 +169,8 @@ unsigned int cpucfg(unsigned int a) {
169169

170170
// LA32-LABEL: @rdtime(
171171
// LA32-NEXT: entry:
172-
// LA32-NEXT: [[TMP0:%.*]] = tail call { i32, i32 } asm sideeffect "rdtimeh.w $0, $1\0A\09", "=&r,=&r"() #[[ATTR1:[0-9]+]], !srcloc !2
173-
// LA32-NEXT: [[TMP1:%.*]] = tail call { i32, i32 } asm sideeffect "rdtimel.w $0, $1\0A\09", "=&r,=&r"() #[[ATTR1]], !srcloc !3
172+
// LA32-NEXT: [[TMP0:%.*]] = tail call { i32, i32 } asm sideeffect "rdtimeh.w $0, $1\0A\09", "=&r,=&r"() #[[ATTR1:[0-9]+]], !srcloc [[META2:![0-9]+]]
173+
// LA32-NEXT: [[TMP1:%.*]] = tail call { i32, i32 } asm sideeffect "rdtimel.w $0, $1\0A\09", "=&r,=&r"() #[[ATTR1]], !srcloc [[META3:![0-9]+]]
174174
// LA32-NEXT: ret void
175175
//
176176
void rdtime() {
@@ -201,13 +201,28 @@ void loongarch_movgr2fcsr(int a) {
201201
__builtin_loongarch_movgr2fcsr(1, a);
202202
}
203203

204-
// CHECK-LABEL: @cacop_w(
205-
// CHECK-NEXT: entry:
206-
// CHECK-NEXT: tail call void @llvm.loongarch.cacop.w(i32 1, i32 [[A:%.*]], i32 1024)
207-
// CHECK-NEXT: tail call void @llvm.loongarch.cacop.w(i32 1, i32 [[A]], i32 1024)
208-
// CHECK-NEXT: ret void
204+
// LA32-LABEL: @cacop_w(
205+
// LA32-NEXT: entry:
206+
// LA32-NEXT: tail call void @llvm.loongarch.cacop.w(i32 1, i32 [[A:%.*]], i32 1024)
207+
// LA32-NEXT: tail call void @llvm.loongarch.cacop.w(i32 1, i32 [[A]], i32 1024)
208+
// LA32-NEXT: ret void
209209
//
210210
void cacop_w(unsigned long int a) {
211211
__cacop_w(1, a, 1024);
212212
__builtin_loongarch_cacop_w(1, a, 1024);
213213
}
214+
215+
// LA32-LABEL: @iocsrrd_h_result(
216+
// LA32-NEXT: entry:
217+
// LA32-NEXT: [[TMP0:%.*]] = tail call i32 @llvm.loongarch.iocsrrd.h(i32 [[A:%.*]])
218+
// LA32-NEXT: [[CONV_I:%.*]] = trunc i32 [[TMP0]] to i16
219+
// LA32-NEXT: [[TMP1:%.*]] = tail call i32 @llvm.loongarch.iocsrrd.h(i32 [[A]])
220+
// LA32-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i16
221+
// LA32-NEXT: [[CONV3:%.*]] = add i16 [[TMP2]], [[CONV_I]]
222+
// LA32-NEXT: ret i16 [[CONV3]]
223+
//
224+
unsigned short iocsrrd_h_result(unsigned int a) {
225+
unsigned short b = __iocsrrd_h(a);
226+
unsigned short c = __builtin_loongarch_iocsrrd_h(a);
227+
return b+c;
228+
}

clang/test/CodeGen/LoongArch/intrinsic-la64.c

+18-3
Original file line numberDiff line numberDiff line change
@@ -387,7 +387,7 @@ unsigned int cpucfg(unsigned int a) {
387387

388388
// CHECK-LABEL: @rdtime_d(
389389
// CHECK-NEXT: entry:
390-
// CHECK-NEXT: [[TMP0:%.*]] = tail call { i64, i64 } asm sideeffect "rdtime.d $0, $1\0A\09", "=&r,=&r"() #[[ATTR1:[0-9]+]], !srcloc !2
390+
// CHECK-NEXT: [[TMP0:%.*]] = tail call { i64, i64 } asm sideeffect "rdtime.d $0, $1\0A\09", "=&r,=&r"() #[[ATTR1:[0-9]+]], !srcloc [[META2:![0-9]+]]
391391
// CHECK-NEXT: ret void
392392
//
393393
void rdtime_d() {
@@ -396,8 +396,8 @@ void rdtime_d() {
396396

397397
// CHECK-LABEL: @rdtime(
398398
// CHECK-NEXT: entry:
399-
// CHECK-NEXT: [[TMP0:%.*]] = tail call { i32, i32 } asm sideeffect "rdtimeh.w $0, $1\0A\09", "=&r,=&r"() #[[ATTR1]], !srcloc !3
400-
// CHECK-NEXT: [[TMP1:%.*]] = tail call { i32, i32 } asm sideeffect "rdtimel.w $0, $1\0A\09", "=&r,=&r"() #[[ATTR1]], !srcloc !4
399+
// CHECK-NEXT: [[TMP0:%.*]] = tail call { i32, i32 } asm sideeffect "rdtimeh.w $0, $1\0A\09", "=&r,=&r"() #[[ATTR1]], !srcloc [[META3:![0-9]+]]
400+
// CHECK-NEXT: [[TMP1:%.*]] = tail call { i32, i32 } asm sideeffect "rdtimel.w $0, $1\0A\09", "=&r,=&r"() #[[ATTR1]], !srcloc [[META4:![0-9]+]]
401401
// CHECK-NEXT: ret void
402402
//
403403
void rdtime() {
@@ -427,3 +427,18 @@ void loongarch_movgr2fcsr(int a) {
427427
__movgr2fcsr(1, a);
428428
__builtin_loongarch_movgr2fcsr(1, a);
429429
}
430+
431+
// CHECK-LABEL: @iocsrrd_h_result(
432+
// CHECK-NEXT: entry:
433+
// CHECK-NEXT: [[TMP0:%.*]] = tail call i32 @llvm.loongarch.iocsrrd.h(i32 [[A:%.*]])
434+
// CHECK-NEXT: [[CONV_I:%.*]] = trunc i32 [[TMP0]] to i16
435+
// CHECK-NEXT: [[TMP1:%.*]] = tail call i32 @llvm.loongarch.iocsrrd.h(i32 [[A]])
436+
// CHECK-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i16
437+
// CHECK-NEXT: [[CONV3:%.*]] = add i16 [[TMP2]], [[CONV_I]]
438+
// CHECK-NEXT: ret i16 [[CONV3]]
439+
//
440+
unsigned short iocsrrd_h_result(unsigned int a) {
441+
unsigned short b = __iocsrrd_h(a);
442+
unsigned short c = __builtin_loongarch_iocsrrd_h(a);
443+
return b+c;
444+
}

clang/test/CodeGen/fat-lto-objects.c

+20-1
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,11 @@
1111
// RUN: llvm-objcopy --dump-section=.llvm.lto=%t.full.split.bc %t.full.split.o
1212
// RUN: llvm-dis %t.full.split.bc -o - | FileCheck %s --check-prefixes=FULL,SPLIT,NOUNIFIED
1313

14+
/// Full LTO always sets EnableSplitLTOUnit when the summary is used.
1415
// RUN: %clang -cc1 -triple x86_64-unknown-linux-gnu -flto=full -ffat-lto-objects -emit-obj < %s -o %t.full.nosplit.o
1516
// RUN: llvm-readelf -S %t.full.nosplit.o | FileCheck %s --check-prefixes=ELF
1617
// RUN: llvm-objcopy --dump-section=.llvm.lto=%t.full.nosplit.bc %t.full.nosplit.o
17-
// RUN: llvm-dis %t.full.nosplit.bc -o - | FileCheck %s --check-prefixes=FULL,NOSPLIT,NOUNIFIED
18+
// RUN: llvm-dis %t.full.nosplit.bc -o - | FileCheck %s --check-prefixes=FULL,SPLIT,NOUNIFIED
1819

1920
// RUN: %clang -cc1 -triple x86_64-unknown-linux-gnu -flto=thin -fsplit-lto-unit -ffat-lto-objects -emit-obj < %s -o %t.thin.split.o
2021
// RUN: llvm-readelf -S %t.thin.split.o | FileCheck %s --check-prefixes=ELF
@@ -34,6 +35,21 @@
3435
// RUN: %clang -cc1 -triple x86_64-unknown-linux-gnu -flto=full -ffat-lto-objects -fsplit-lto-unit -S < %s -o - \
3536
// RUN: | FileCheck %s --check-prefixes=ASM
3637

38+
/// Make sure that FatLTO generates .llvm.lto sections that are the same as the output from normal LTO compilations
39+
// RUN: %clang -O2 --target=x86_64-unknown-linux-gnu -fPIE -flto=full -ffat-lto-objects -c %s -o %t.fatlto.full.o
40+
// RUN: llvm-objcopy --dump-section=.llvm.lto=%t.fatlto.full.bc %t.fatlto.full.o
41+
// RUN: llvm-dis < %t.fatlto.full.bc -o %t.fatlto.full.ll
42+
// RUN: %clang -O2 --target=x86_64-unknown-linux-gnu -fPIE -flto=full -c %s -o %t.nofat.full.bc
43+
// RUN: llvm-dis < %t.nofat.full.bc -o %t.nofat.full.ll
44+
// RUN: diff %t.fatlto.full.ll %t.nofat.full.ll
45+
46+
// RUN: %clang -O2 --target=x86_64-unknown-linux-gnu -fPIE -flto=thin -ffat-lto-objects -c %s -o %t.fatlto.thin.o
47+
// RUN: llvm-objcopy --dump-section=.llvm.lto=%t.fatlto.thin.bc %t.fatlto.thin.o
48+
// RUN: llvm-dis < %t.fatlto.thin.bc -o %t.fatlto.thin.ll
49+
// RUN: %clang -O2 --target=x86_64-unknown-linux-gnu -fPIE -flto=thin -c %s -o %t.nofat.thin.bc
50+
// RUN: llvm-dis < %t.nofat.thin.bc -o %t.nofat.thin.ll
51+
// RUN: diff %t.fatlto.thin.ll %t.nofat.thin.ll
52+
3753
/// Be sure we enable split LTO units correctly under -ffat-lto-objects.
3854
// SPLIT: ![[#]] = !{i32 1, !"EnableSplitLTOUnit", i32 1}
3955
// NOSPLIT: ![[#]] = !{i32 1, !"EnableSplitLTOUnit", i32 0}
@@ -51,6 +67,9 @@
5167
// ASM-NEXT: .asciz "BC
5268
// ASM-NEXT: .size .Lllvm.embedded.object
5369

70+
const char* foo = "foo";
71+
5472
int test(void) {
73+
const char* bar = "bar";
5574
return 0xabcd;
5675
}

0 commit comments

Comments
 (0)