Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
CMAKE_CXX_STANDARD=23
HONOR_EXTERNAL_LLVM_LINK_LLVM_DYLIB=ON
builtin_llvm=OFF
builtin_mathtext=OFF
test_distrdf_pyspark=OFF
2 changes: 2 additions & 0 deletions .github/workflows/root-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@
matrix:
# Specify platform + optional build option overrides
# Build options: https://root.cern/install/build_from_source/#all-build-options
platform: [mac26, mac27, mac-beta]

Check failure on line 123 in .github/workflows/root-ci.yml

View workflow job for this annotation

GitHub Actions / lint-action-files

label "mac27" is unknown. available labels are "windows-latest", "windows-latest-8-cores", "windows-2025", "windows-2025-vs2026", "windows-2022", "windows-11-arm", "ubuntu-slim", "ubuntu-latest", "ubuntu-latest-4-cores", "ubuntu-latest-8-cores", "ubuntu-latest-16-cores", "ubuntu-24.04", "ubuntu-24.04-arm", "ubuntu-22.04", "ubuntu-22.04-arm", "macos-latest", "macos-latest-xlarge", "macos-latest-large", "macos-26-intel", "macos-26-xlarge", "macos-26-large", "macos-26", "macos-15-intel", "macos-15-xlarge", "macos-15-large", "macos-15", "macos-14-xlarge", "macos-14-large", "macos-14", "self-hosted", "x64", "arm", "arm64", "linux", "macos", "windows", "mac14", "mac15", "mac26", "mac-beta", "cpu", "latest", "preview". if it is a custom label for self-hosted runner, set list of labels in actionlint.yaml config file
arch: [ARM64]
include:
- platform: mac15
Expand All @@ -132,7 +132,7 @@
- self-hosted
- ${{ matrix.platform }}

name: |

Check failure on line 135 in .github/workflows/root-ci.yml

View workflow job for this annotation

GitHub Actions / lint-action-files

property "overrides" is not defined in object type {arch: string; is_special: bool; platform: string}
${{ matrix.platform }} ${{ matrix.arch }}
${{ (github.event_name != 'schedule' && github.event_name != 'workflow_dispatch' && join( matrix.overrides, ', ' )) || '' }}

Expand All @@ -151,8 +151,8 @@
if: github.event_name == 'pull_request'
env:
GITHUB_PR_ORIGIN: ${{ github.event.pull_request.head.repo.clone_url }}
OVERRIDES: ${{ join( matrix.overrides, ' ') }}

Check failure on line 154 in .github/workflows/root-ci.yml

View workflow job for this annotation

GitHub Actions / lint-action-files

property "overrides" is not defined in object type {arch: string; is_special: bool; platform: string}
run: |

Check failure on line 155 in .github/workflows/root-ci.yml

View workflow job for this annotation

GitHub Actions / lint-action-files

"github.event.pull_request.head.ref" is potentially untrusted. avoid using it directly in inline scripts. instead, pass it through an environment variable. see https://docs.github.com/en/actions/reference/security/secure-use#good-practices-for-mitigating-script-injection-attacks for more details
[ -d "${VIRTUAL_ENV_DIR}" ] && source ${VIRTUAL_ENV_DIR}/bin/activate
echo "Python is now $(which python3) $(python3 --version)"
src/.github/workflows/root-ci-config/build_root.py \
Expand Down Expand Up @@ -409,6 +409,8 @@
- image: ubuntu2610
- image: debian13
overrides: ["dev=ON", "CMAKE_CXX_FLAGS=-Wsuggest-override"]
- image: debiantesting
overrides: ["CMAKE_BUILD_TYPE=Release"]
# Special builds
- image: alma9
platform_config: alma9-modules_off
Expand Down
96 changes: 52 additions & 44 deletions core/dictgen/src/rootcling_impl.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,10 @@ namespace genreflex {
////////////////////////////////////////////////////////////////////////////////

static llvm::cl::OptionCategory gRootclingOptions("rootcling common options");
// rootcling's options are registered in their own subcommand instead of the top-level one, where LLVM registers its
// options. Otherwise, when linking against a shared libLLVM, names that exist in both (like -W) abort at startup with
// "Option 'W' registered more than once!". RootClingMain selects this subcommand before parsing the command line.
static llvm::cl::SubCommand gRootclingSubcommand("rootcling", "Generate a dictionary.");

////////////////////////////////////////////////////////////////////////////////

Expand Down Expand Up @@ -3386,17 +3390,17 @@ class TRootClingCallbacks : public cling::InterpreterCallbacks {

static llvm::cl::opt<bool> gOptSystemModuleByproducts("mSystemByproducts", llvm::cl::Hidden,
llvm::cl::desc("Allow implicit build of system modules."),
llvm::cl::cat(gRootclingOptions));
llvm::cl::cat(gRootclingOptions), llvm::cl::sub(gRootclingSubcommand));
static llvm::cl::list<std::string>
gOptModuleByproducts("mByproduct", llvm::cl::ZeroOrMore,
llvm::cl::Hidden,
llvm::cl::desc("The list of the expected implicit modules build as part of building the current module."),
llvm::cl::cat(gRootclingOptions));
llvm::cl::cat(gRootclingOptions), llvm::cl::sub(gRootclingSubcommand));
// Really llvm::cl::Required, will be changed in RootClingMain below.
static llvm::cl::opt<std::string>
gOptDictionaryFileName(llvm::cl::Positional,
llvm::cl::desc("<output dictionary file>"),
llvm::cl::cat(gRootclingOptions));
llvm::cl::cat(gRootclingOptions), llvm::cl::sub(gRootclingSubcommand));

////////////////////////////////////////////////////////////////////////////////
/// Custom diag client for clang that verifies that each implicitly build module
Expand Down Expand Up @@ -3533,10 +3537,10 @@ static void MaybeSuppressWin32CrashDialogs() {
}

static llvm::cl::opt<bool> gOptForce("f", llvm::cl::desc("Overwrite <file>s."),
llvm::cl::cat(gRootclingOptions));
llvm::cl::cat(gRootclingOptions), llvm::cl::sub(gRootclingSubcommand));
static llvm::cl::opt<bool> gOptRootBuild("rootbuild", llvm::cl::desc("If we are building ROOT."),
llvm::cl::Hidden,
llvm::cl::cat(gRootclingOptions));
llvm::cl::cat(gRootclingOptions), llvm::cl::sub(gRootclingSubcommand));
enum VerboseLevel {
v = ROOT::TMetaUtils::kError,
v0 = ROOT::TMetaUtils::kFatal,
Expand All @@ -3554,96 +3558,96 @@ gOptVerboseLevel(llvm::cl::desc("Choose verbosity level:"),
clEnumVal(v3, "Show notes."),
clEnumVal(v4, "Show information.")),
llvm::cl::init(v2),
llvm::cl::cat(gRootclingOptions));
llvm::cl::cat(gRootclingOptions), llvm::cl::sub(gRootclingSubcommand));

static llvm::cl::opt<bool>
gOptCint("cint", llvm::cl::desc("Deprecated, legacy flag which is ignored."),
llvm::cl::Hidden,
llvm::cl::cat(gRootclingOptions));
llvm::cl::cat(gRootclingOptions), llvm::cl::sub(gRootclingSubcommand));
static llvm::cl::opt<bool>
gOptReflex("reflex", llvm::cl::desc("Behave internally like genreflex."),
llvm::cl::cat(gRootclingOptions));
llvm::cl::cat(gRootclingOptions), llvm::cl::sub(gRootclingSubcommand));
static llvm::cl::opt<bool>
gOptGccXml("gccxml", llvm::cl::desc("Deprecated, legacy flag which is ignored."),
llvm::cl::Hidden,
llvm::cl::cat(gRootclingOptions));
llvm::cl::cat(gRootclingOptions), llvm::cl::sub(gRootclingSubcommand));
static llvm::cl::opt<std::string>
gOptLibListPrefix("lib-list-prefix",
llvm::cl::desc("An ACLiC feature which exports the list of dependent libraries."),
llvm::cl::Hidden,
llvm::cl::cat(gRootclingOptions));
llvm::cl::cat(gRootclingOptions), llvm::cl::sub(gRootclingSubcommand));
static llvm::cl::opt<bool>
gOptGeneratePCH("generate-pch",
llvm::cl::desc("Generates a pch file from a predefined set of headers. See makepch.py."),
llvm::cl::Hidden,
llvm::cl::cat(gRootclingOptions));
llvm::cl::cat(gRootclingOptions), llvm::cl::sub(gRootclingSubcommand));
static llvm::cl::opt<bool>
gOptC("c", llvm::cl::desc("Deprecated, legacy flag which is ignored."),
llvm::cl::cat(gRootclingOptions));
llvm::cl::cat(gRootclingOptions), llvm::cl::sub(gRootclingSubcommand));
static llvm::cl::opt<bool>
gOptP("p", llvm::cl::desc("Deprecated, legacy flag which is ignored."),
llvm::cl::cat(gRootclingOptions));
llvm::cl::cat(gRootclingOptions), llvm::cl::sub(gRootclingSubcommand));
static llvm::cl::list<std::string>
gOptRootmapLibNames("rml", llvm::cl::ZeroOrMore,
llvm::cl::desc("Generate rootmap file."),
llvm::cl::cat(gRootclingOptions));
llvm::cl::cat(gRootclingOptions), llvm::cl::sub(gRootclingSubcommand));
static llvm::cl::opt<std::string>
gOptRootMapFileName("rmf",
llvm::cl::desc("Generate a rootmap file with the specified name."),
llvm::cl::cat(gRootclingOptions));
llvm::cl::cat(gRootclingOptions), llvm::cl::sub(gRootclingSubcommand));
static llvm::cl::opt<bool>
gOptCxxModule("cxxmodule",
llvm::cl::desc("Generate a C++ module."),
llvm::cl::cat(gRootclingOptions));
llvm::cl::cat(gRootclingOptions), llvm::cl::sub(gRootclingSubcommand));
static llvm::cl::list<std::string>
gOptModuleMapFiles("moduleMapFile",
llvm::cl::desc("Specify a C++ modulemap file."),
llvm::cl::cat(gRootclingOptions));
llvm::cl::cat(gRootclingOptions), llvm::cl::sub(gRootclingSubcommand));
// FIXME: Figure out how to combine the code of -umbrellaHeader and inlineInputHeader
static llvm::cl::opt<bool>
gOptUmbrellaInput("umbrellaHeader",
llvm::cl::desc("A single header including all headers instead of specifying them on the command line."),
llvm::cl::cat(gRootclingOptions));
llvm::cl::cat(gRootclingOptions), llvm::cl::sub(gRootclingSubcommand));
static llvm::cl::opt<bool>
gOptMultiDict("multiDict",
llvm::cl::desc("If this library has multiple separate LinkDef files."),
llvm::cl::cat(gRootclingOptions));
llvm::cl::cat(gRootclingOptions), llvm::cl::sub(gRootclingSubcommand));
static llvm::cl::opt<bool>
gOptNoGlobalUsingStd("noGlobalUsingStd",
llvm::cl::desc("Do not declare {using namespace std} in dictionary global scope."),
llvm::cl::cat(gRootclingOptions));
llvm::cl::cat(gRootclingOptions), llvm::cl::sub(gRootclingSubcommand));
static llvm::cl::opt<bool>
gOptInterpreterOnly("interpreteronly",
llvm::cl::desc("Generate minimal dictionary for interactivity (without IO information)."),
llvm::cl::cat(gRootclingOptions));
llvm::cl::cat(gRootclingOptions), llvm::cl::sub(gRootclingSubcommand));
static llvm::cl::opt<bool>
gOptSplit("split",
llvm::cl::desc("Split the dictionary into two parts: one containing the IO (ClassDef)\
information and another the interactivity support."),
llvm::cl::cat(gRootclingOptions));
llvm::cl::cat(gRootclingOptions), llvm::cl::sub(gRootclingSubcommand));
static llvm::cl::opt<bool>
gOptNoDictSelection("noDictSelection",
llvm::cl::Hidden,
llvm::cl::desc("Do not run the selection rules. Useful when in -onepcm mode."),
llvm::cl::cat(gRootclingOptions));
llvm::cl::cat(gRootclingOptions), llvm::cl::sub(gRootclingSubcommand));
static llvm::cl::opt<std::string>
gOptSharedLibFileName("s",
llvm::cl::desc("The path to the library of the built dictionary."),
llvm::cl::cat(gRootclingOptions));
llvm::cl::cat(gRootclingOptions), llvm::cl::sub(gRootclingSubcommand));
static llvm::cl::list<std::string>
gOptModuleDependencies("m",
llvm::cl::desc("The list of dependent modules of the dictionary."),
llvm::cl::cat(gRootclingOptions));
llvm::cl::cat(gRootclingOptions), llvm::cl::sub(gRootclingSubcommand));
static llvm::cl::list<std::string>
gOptExcludePaths("excludePath", llvm::cl::ZeroOrMore,
llvm::cl::desc("Do not store the <path> in the dictionary."),
llvm::cl::cat(gRootclingOptions));
llvm::cl::cat(gRootclingOptions), llvm::cl::sub(gRootclingSubcommand));
// FIXME: This does not seem to work. We have one use of -inlineInputHeader in
// ROOT and it does not produce the expected result.
static llvm::cl::opt<bool>
gOptInlineInput("inlineInputHeader",
llvm::cl::desc("Does not generate #include <header> but expands the header content."),
llvm::cl::cat(gRootclingOptions));
llvm::cl::cat(gRootclingOptions), llvm::cl::sub(gRootclingSubcommand));
// FIXME: This is totally the wrong concept. We should not expose an interface
// to be able to tell which component is in the pch and which needs extra
// scaffolding for interactive use. Moreover, some of the ROOT components are
Expand All @@ -3654,61 +3658,61 @@ static llvm::cl::opt<bool>
gOptWriteEmptyRootPCM("writeEmptyRootPCM",
llvm::cl::Hidden,
llvm::cl::desc("Does not include the header files as it assumes they exist in the pch."),
llvm::cl::cat(gRootclingOptions));
llvm::cl::cat(gRootclingOptions), llvm::cl::sub(gRootclingSubcommand));
static llvm::cl::opt<bool>
gOptCheckSelectionSyntax("selSyntaxOnly",
llvm::cl::desc("Check the selection syntax only."),
llvm::cl::cat(gRootclingOptions));
llvm::cl::cat(gRootclingOptions), llvm::cl::sub(gRootclingSubcommand));
static llvm::cl::opt<bool>
gOptFailOnWarnings("failOnWarnings",
llvm::cl::desc("Fail if there are warnings."),
llvm::cl::cat(gRootclingOptions));
llvm::cl::cat(gRootclingOptions), llvm::cl::sub(gRootclingSubcommand));
static llvm::cl::opt<bool>
gOptNoIncludePaths("noIncludePaths",
llvm::cl::desc("Do not store include paths but rely on the env variable ROOT_INCLUDE_PATH."),
llvm::cl::cat(gRootclingOptions));
llvm::cl::cat(gRootclingOptions), llvm::cl::sub(gRootclingSubcommand));
static llvm::cl::opt<std::string>
gOptISysRoot("isysroot", llvm::cl::Prefix, llvm::cl::Hidden,
llvm::cl::desc("Specify an isysroot."),
llvm::cl::cat(gRootclingOptions),
llvm::cl::cat(gRootclingOptions), llvm::cl::sub(gRootclingSubcommand),
llvm::cl::init("-"));
static llvm::cl::list<std::string>
gOptIncludePaths("I", llvm::cl::Prefix, llvm::cl::ZeroOrMore,
llvm::cl::desc("Specify an include path."),
llvm::cl::cat(gRootclingOptions));
llvm::cl::cat(gRootclingOptions), llvm::cl::sub(gRootclingSubcommand));
static llvm::cl::list<std::string>
gOptCompDefaultIncludePaths("compilerI", llvm::cl::Prefix, llvm::cl::ZeroOrMore,
llvm::cl::desc("Specify a compiler default include path, to suppress unneeded `-isystem` arguments."),
llvm::cl::cat(gRootclingOptions));
llvm::cl::cat(gRootclingOptions), llvm::cl::sub(gRootclingSubcommand));
static llvm::cl::list<std::string>
gOptSysIncludePaths("isystem", llvm::cl::ZeroOrMore,
llvm::cl::desc("Specify a system include path."),
llvm::cl::cat(gRootclingOptions));
llvm::cl::cat(gRootclingOptions), llvm::cl::sub(gRootclingSubcommand));
static llvm::cl::list<std::string>
gOptPPDefines("D", llvm::cl::Prefix, llvm::cl::ZeroOrMore,
llvm::cl::desc("Specify defined macros."),
llvm::cl::cat(gRootclingOptions));
llvm::cl::cat(gRootclingOptions), llvm::cl::sub(gRootclingSubcommand));
static llvm::cl::list<std::string>
gOptPPUndefines("U", llvm::cl::Prefix, llvm::cl::ZeroOrMore,
llvm::cl::desc("Specify undefined macros."),
llvm::cl::cat(gRootclingOptions));
llvm::cl::cat(gRootclingOptions), llvm::cl::sub(gRootclingSubcommand));
static llvm::cl::list<std::string>
gOptWDiags("W", llvm::cl::Prefix, llvm::cl::ZeroOrMore,
llvm::cl::desc("Specify compiler diagnostics options."),
llvm::cl::cat(gRootclingOptions));
llvm::cl::cat(gRootclingOptions), llvm::cl::sub(gRootclingSubcommand));
static llvm::cl::opt<std::string>
gOptDepFile("MF",
llvm::cl::desc("Write dependency output to the specified file."),
llvm::cl::cat(gRootclingOptions));
llvm::cl::cat(gRootclingOptions), llvm::cl::sub(gRootclingSubcommand));
// Really OneOrMore, will be changed in RootClingMain below.
static llvm::cl::list<std::string>
gOptDictionaryHeaderFiles(llvm::cl::Positional, llvm::cl::ZeroOrMore,
llvm::cl::desc("<list of dictionary header files> <LinkDef file | selection xml file>"),
llvm::cl::cat(gRootclingOptions));
llvm::cl::cat(gRootclingOptions), llvm::cl::sub(gRootclingSubcommand));
static llvm::cl::list<std::string>
gOptSink(llvm::cl::ZeroOrMore, llvm::cl::Sink,
llvm::cl::desc("Consumes all unrecognized options."),
llvm::cl::cat(gRootclingOptions));
llvm::cl::cat(gRootclingOptions), llvm::cl::sub(gRootclingSubcommand));

static llvm::cl::SubCommand
gBareClingSubcommand("bare-cling", "Call directly cling and exit.");
Expand Down Expand Up @@ -3905,10 +3909,10 @@ int RootClingMain(int argc,
#endif

// Hide options from llvm which we got from static initialization of libCling.
llvm::cl::HideUnrelatedOptions(/*keep*/gRootclingOptions);
llvm::cl::HideUnrelatedOptions(/*keep*/gRootclingOptions, gRootclingSubcommand);

// Define Options aliasses
auto &opts = llvm::cl::getRegisteredOptions();
auto &opts = llvm::cl::getRegisteredOptions(gRootclingSubcommand);
llvm::cl::Option* optHelp = opts["help"];
llvm::cl::alias optHelpAlias1("h",
llvm::cl::desc("Alias for -help"),
Expand All @@ -3917,7 +3921,11 @@ int RootClingMain(int argc,
llvm::cl::desc("Alias for -help"),
llvm::cl::aliasopt(*optHelp));

llvm::cl::ParseCommandLineOptions(argc, argv, "rootcling");
// llvm::cl selects a subcommand by the first argument, so name ours unless bare-cling was asked for.
std::vector<const char *> clArgs(argv, argv + argc);
if (argc < 2 || gBareClingSubcommand.getName() != argv[1])
clArgs.insert(clArgs.begin() + 1, gRootclingSubcommand.getName().data());
llvm::cl::ParseCommandLineOptions(clArgs.size(), clArgs.data(), "rootcling");

const char *etcDir = gDriverConfig->fTROOT__GetEtcDir();
std::string llvmResourceDir = etcDir ? std::string(etcDir) + "/cling" : "";
Expand Down
31 changes: 16 additions & 15 deletions interpreter/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ set(LLVM_ENABLE_FFI OFF CACHE BOOL "")
set(LLVM_ENABLE_OCAMLDOC OFF CACHE BOOL "")
set(LLVM_ENABLE_Z3_SOLVER OFF CACHE BOOL "")
set(LLVM_ENABLE_WARNINGS OFF CACHE BOOL "")
set(HONOR_EXTERNAL_LLVM_LINK_LLVM_DYLIB OFF CACHE BOOL "Setting this to ON could break ROOT and is not officially supported. If disabled, it force-overwrites all LLVM_LINK_LLVM_DYLIB to OFF. It enabled with builtin_llvm, it follows whatever find_package sets this variable to.")

# When ROOT provides zlib as a builtin, disable it in the bundled LLVM so it
# cannot discover and link the *system* copy (mixing two versions in one
Expand Down Expand Up @@ -391,21 +392,21 @@ else()
# install-clang-cpp target defined by LLVM's cmake module
set(CLANG_LINKS_TO_CREATE clang++ clang-cl)

# Disable linking against shared LLVM
set(LLVM_LINK_LLVM_DYLIB OFF)
# To ensure this override stays constant, we need to avoid subdirectories calling find_package(LLVM),
# which would set it to ON again if system was compiled that way
# Define a macro with a toggle flag to override find_package, that will only be visible in this scope, not in parent one.
# TEMPORARY: remove this workaround once ROOT can link against the shared
# libLLVM.so for builtin_llvm=OFF
macro(find_package _package_name)
if(ROOT_SKIP_FIND_LLVM_WITHIN_CLANG AND "${_package_name}" STREQUAL "LLVM")
message(STATUS "[ROOT] Suppressed find_package(LLVM) at ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE}"
" to keep LLVM_LINK_LLVM_DYLIB=OFF.")
else()
_find_package(${_package_name} ${ARGN})
endif()
endmacro()
if (NOT HONOR_EXTERNAL_LLVM_LINK_LLVM_DYLIB)
set(LLVM_LINK_LLVM_DYLIB OFF)
# Disable linking against shared LLVM in case system-version has shared libs, forces static choice of ROOT
Comment thread
ferdymercury marked this conversation as resolved.
# To ensure this override stays constant, we need to avoid subdirectories calling find_package(LLVM),
# which would set it to ON again if system was compiled that way
# Define a macro with a toggle flag to override find_package, that will only be visible in this scope, not in parent one.
macro(find_package _package_name)
if(ROOT_SKIP_FIND_LLVM_WITHIN_CLANG AND "${_package_name}" STREQUAL "LLVM")
message(STATUS "[ROOT] Suppressed find_package(LLVM) at ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE}"
" to keep LLVM_LINK_LLVM_DYLIB=OFF.")
else()
_find_package(${_package_name} ${ARGN})
endif()
endmacro()
endif()

# Always build LLVM with C++17. It is not necessary to compile with the same
# C++ standard as the rest of ROOT and sometimes it doesn't even work.
Expand Down
8 changes: 6 additions & 2 deletions interpreter/cling/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -342,8 +342,12 @@ macro(add_cling_library name)
endif()
endif()

# Set DISABLE_LLVM_LINK_LLVM_DYLIB to disable linking against shared LLVM
llvm_add_library(${name} ${ARG_ENABLE_SHARED} DISABLE_LLVM_LINK_LLVM_DYLIB ${ARG_UNPARSED_ARGUMENTS} ${srcs})
set(conditional_llvm_link_flags)
if(NOT HONOR_EXTERNAL_LLVM_LINK_LLVM_DYLIB)
# Set DISABLE_LLVM_LINK_LLVM_DYLIB to disable linking against shared LLVM
set(conditional_llvm_link_flags DISABLE_LLVM_LINK_LLVM_DYLIB)
endif()
llvm_add_library(${name} ${ARG_ENABLE_SHARED} ${conditional_llvm_link_flags} ${ARG_UNPARSED_ARGUMENTS} ${srcs})

if (MSVC AND cling_ex_file_match)
# /EHs because cling_runtime_internal_throwIfInvalidPointer is extern “C”
Expand Down
Loading
Loading