From 6923402504d09f2aec116bd7474cb286247f3028 Mon Sep 17 00:00:00 2001 From: Kevin Boyd Date: Sat, 19 Sep 2026 09:49:19 -0400 Subject: [PATCH 1/2] Enable targeted clang-tidy readability checks --- .clang-tidy | 20 ++++++++- admin/run_clang_tidy.sh | 7 +-- src/conformer_rmsd_mol.cpp | 21 ++++++--- src/data_structures/flat_bit_vect.h | 2 +- src/morgan_fingerprint_common.cpp | 4 +- src/morgan_fingerprint_cpu.cpp | 2 +- src/substruct/molecules.cpp | 18 +++++--- src/substruct/substruct_launch_config.cpp | 48 ++++++++++++++------- src/substruct/substruct_search_internal.cpp | 3 +- src/substruct/substruct_search_internal.h | 6 ++- src/tfd/tfd_common.cpp | 46 +++++++++++--------- src/tfd/tfd_cpu.cpp | 24 +++++++---- src/utils/device.cpp | 2 +- src/utils/device_vector.h | 2 +- 14 files changed, 134 insertions(+), 71 deletions(-) diff --git a/.clang-tidy b/.clang-tidy index e9be1630..cea8551b 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -23,8 +23,26 @@ Checks: # Enum representation is an ABI and data-layout decision, not a blanket # optimization; smaller underlying types can also add conversion overhead. - '-performance-enum-size' + - readability-ambiguous-smartptr-reset-call + - readability-avoid-return-with-void-value + - readability-avoid-unconditional-preprocessor-if + - readability-braces-around-statements + - readability-const-return-type + - readability-container-contains + - readability-container-data-pointer + - readability-container-size-empty + - readability-delete-null-pointer + - readability-duplicate-include + - readability-inconsistent-ifelse-braces + - readability-misleading-indentation + - readability-misplaced-array-index + - readability-qualified-auto + - readability-redundant-casting + - readability-redundant-typename + - readability-reference-to-constructed-temporary + - readability-uniqueptr-delete-release WarningsAsErrors: '*' -HeaderFilterRegex: '.*/(src|rdkit_extensions)/.*' +HeaderFilterRegex: '.*/src/.*' FormatStyle: none CheckOptions: # int8_t is used as a small integer (including negative sentinels), not as a diff --git a/admin/run_clang_tidy.sh b/admin/run_clang_tidy.sh index 93403db1..22aa0f80 100644 --- a/admin/run_clang_tidy.sh +++ b/admin/run_clang_tidy.sh @@ -82,8 +82,9 @@ cmake "${cmake_args[@]}" -config-file "${ROOT}/.clang-tidy" \ -p "${BUILD_DIR}" \ -j "${JOBS}" \ + -header-filter "^${ROOT}/src/" \ "${FIX_ARGS[@]}" \ - '.*\.cpp$' + "^${ROOT}/src/.*\.cpp$" PYTHON="${PYTHON_BINARY:-$(find_tool python3 python)}" if [[ -z "${PYTHON}" ]]; then @@ -109,7 +110,7 @@ CUDA_TIDY_BUILD_DIR="${BUILD_DIR}/clang_tidy_cuda" -p "${CUDA_TIDY_BUILD_DIR}" \ -j "${JOBS}" \ -extra-arg=--cuda-host-only \ - -header-filter "^${ROOT}/(src|rdkit_extensions)/" \ - -line-filter "[{\"name\":\"^${ROOT}/(src|rdkit_extensions)/\"}]" \ + -header-filter "^${ROOT}/src/" \ + -line-filter "[{\"name\":\"^${ROOT}/src/\"}]" \ "${FIX_ARGS[@]}" \ '.*\.cu$' diff --git a/src/conformer_rmsd_mol.cpp b/src/conformer_rmsd_mol.cpp index 7d8a7cd3..193d2dcd 100644 --- a/src/conformer_rmsd_mol.cpp +++ b/src/conformer_rmsd_mol.cpp @@ -87,8 +87,9 @@ std::vector> conformerRmsdBatchMatrixMol(const std::ve cudaStream_t stream, const bool alignToFirstConformer) { const int numMols = static_cast(mols.size()); - if (numMols == 0) + if (numMols == 0) { return {}; + } const bool needsFirstConformerAlignment = !prealigned && alignToFirstConformer; // --- Validate inputs and compute per-molecule metadata --- @@ -103,8 +104,9 @@ std::vector> conformerRmsdBatchMatrixMol(const std::ve std::vector coordOffsetsVec(numMols); pairOffsetsVec[0] = 0; - if (needsFirstConformerAlignment) + if (needsFirstConformerAlignment) { conformerOffsetsVec[0] = 0; + } size_t totalCoords = 0; for (int m = 0; m < numMols; ++m) { if (!mols[m]) { @@ -145,8 +147,9 @@ std::vector> conformerRmsdBatchMatrixMol(const std::ve AsyncDeviceVector devPairOffsets(numMols + 1, stream); AsyncDeviceVector devConformerOffsets; AsyncDeviceVector devCoordOffsets(numMols, stream); - if (needsFirstConformerAlignment) + if (needsFirstConformerAlignment) { devConformerOffsets = AsyncDeviceVector(numMols + 1, stream); + } // Per-molecule output buffers. Always allocate at least 1 element so that // devRmsdPtrs never contains a null — zero-pair molecules dispatch 0 blocks @@ -172,8 +175,9 @@ std::vector> conformerRmsdBatchMatrixMol(const std::ve numConfsArr[m] = numConfsVec[m]; numAtomsArr[m] = numAtomsVec[m]; pairOffsetsArr[m] = pairOffsetsVec[m]; - if (needsFirstConformerAlignment) + if (needsFirstConformerAlignment) { conformerOffsetsArr[m] = conformerOffsetsVec[m]; + } coordOffsetsArr[m] = coordOffsetsVec[m]; hostRmsdPtrs[m] = devRmsdVecs[m].data(); @@ -191,17 +195,20 @@ std::vector> conformerRmsdBatchMatrixMol(const std::ve } } pairOffsetsArr[numMols] = pairOffsetsVec[numMols]; - if (needsFirstConformerAlignment) + if (needsFirstConformerAlignment) { conformerOffsetsArr[numMols] = conformerOffsetsVec[numMols]; + } // --- Transfer to device and launch --- - if (totalCoords > 0) + if (totalCoords > 0) { hostCoords.copyToDevice(devCoords, stream); + } numConfsArr.copyToDevice(devNumConfs, stream); numAtomsArr.copyToDevice(devNumAtoms, stream); pairOffsetsArr.copyToDevice(devPairOffsets, stream); - if (needsFirstConformerAlignment) + if (needsFirstConformerAlignment) { conformerOffsetsArr.copyToDevice(devConformerOffsets, stream); + } coordOffsetsArr.copyToDevice(devCoordOffsets, stream); hostRmsdPtrs.copyToDevice(devRmsdPtrs, stream); diff --git a/src/data_structures/flat_bit_vect.h b/src/data_structures/flat_bit_vect.h index a64c5bef..97dfe953 100644 --- a/src/data_structures/flat_bit_vect.h +++ b/src/data_structures/flat_bit_vect.h @@ -104,7 +104,7 @@ template struct FlatBitVectStorage { //! In-memory bitvect. template class FlatBitVect { public: - using StorageType = typename detail::FlatBitVectStorage::StorageType; + using StorageType = detail::FlatBitVectStorage::StorageType; constexpr static std::size_t kNBits = detail::FlatBitVectStorage::kNBits; constexpr static std::size_t kStorageBytes = detail::FlatBitVectStorage::kStorageBytes; constexpr static std::size_t kStorageBits = detail::FlatBitVectStorage::kStorageBits; diff --git a/src/morgan_fingerprint_common.cpp b/src/morgan_fingerprint_common.cpp index 6fc70dae..01a01286 100644 --- a/src/morgan_fingerprint_common.cpp +++ b/src/morgan_fingerprint_common.cpp @@ -151,8 +151,8 @@ void MorganInvariantsGenerator::ComputeInvariantsInto(const std::vector(tAtom->getMass() - periodicTable->getAtomicWeight(tAtom->getAtomicNum())); } - const auto explicitImplicitHs = static_cast(tAtom->getNumExplicitHs() + tAtom->getNumImplicitHs()); - const unsigned int totalDegree = explicitImplicitHs + bondCounts[atomIdx]; + const auto explicitImplicitHs = tAtom->getNumExplicitHs() + tAtom->getNumImplicitHs(); + const unsigned int totalDegree = explicitImplicitHs + bondCounts[atomIdx]; const unsigned int totalHsIncludingNeighbors = explicitImplicitHs + neighboringHydrogenCounts[atomIdx]; const bool isInRing = ringInfo->numAtomRings(tAtom->getIdx()) > 0; diff --git a/src/morgan_fingerprint_cpu.cpp b/src/morgan_fingerprint_cpu.cpp index 14f6452a..c99fb849 100644 --- a/src/morgan_fingerprint_cpu.cpp +++ b/src/morgan_fingerprint_cpu.cpp @@ -227,7 +227,7 @@ std::vector getEnvironments(const RDKit::ROMol& mol for (const auto& iter : allNeighborhoodsThisRound) { // if we haven't seen this exact environment before, add it to the // result - if (neighborhoods.count(std::get<0>(iter)) == 0) { + if (!neighborhoods.contains(std::get<0>(iter))) { if (!onlyNonzeroInvariants || (*atomInvariants)[std::get<2>(iter)] != 0) { if (includeAtoms[std::get<2>(iter)]) { result.emplace_back(std::get<1>(iter), std::get<2>(iter), layer + 1); diff --git a/src/substruct/molecules.cpp b/src/substruct/molecules.cpp index bcd4b1a0..d82524e7 100644 --- a/src/substruct/molecules.cpp +++ b/src/substruct/molecules.cpp @@ -230,12 +230,13 @@ int getQueryBondEffectiveType(const RDKit::Bond* bond) { if (childDesc == "BondOrder") { const auto* eqQuery = static_cast((*it).get()); int childType = eqQuery->getVal(); - if (childType == 1) + if (childType == 1) { hasSingle = true; - else if (childType == 2) + } else if (childType == 2) { hasDouble = true; - else if (childType == 7 || childType == 12) + } else if (childType == 7 || childType == 12) { hasAromatic = true; + } } else if (childDesc == "BondIsAromatic") { hasAromatic = true; } @@ -1159,10 +1160,12 @@ uint8_t processQueryTree(const RDKit::Atom::QUERYATOM_QUERY* query, const auto* rangeQuery = static_cast(query); int minVal = rangeQuery->getLower(); int maxVal = rangeQuery->getUpper(); - if (minVal < 0) + if (minVal < 0) { minVal = 0; - if (maxVal > 255) + } + if (maxVal > 255) { maxVal = 255; + } result = builder.addCompare(BoolOp::Range, field, static_cast(minVal), static_cast(maxVal)); } @@ -1766,7 +1769,7 @@ int collectRecursivePatterns(const RDKit::Atom::QUERYATOM_QUERY* query, } const auto* recursiveQuery = static_cast(query); - auto queryMol = recursiveQuery->getQueryMol(); + const auto* queryMol = recursiveQuery->getQueryMol(); if (queryMol != nullptr) { const int thisPatternIdx = static_cast(patterns.size()); @@ -1951,8 +1954,9 @@ RecursivePatternInfo extractRecursivePatterns(const RDKit::ROMol* mol) { */ void mergeBatch(MoleculesHost& dest, const MoleculesHost& src) { ScopedNvtxRange range("mergeBatch"); - if (src.numMolecules() == 0) + if (src.numMolecules() == 0) { return; + } const int atomOffset = static_cast(dest.atomDataPacked.size()); const int instrOffset = static_cast(dest.queryInstructions.size()); diff --git a/src/substruct/substruct_launch_config.cpp b/src/substruct/substruct_launch_config.cpp index 01374746..6422807d 100644 --- a/src/substruct/substruct_launch_config.cpp +++ b/src/substruct/substruct_launch_config.cpp @@ -115,56 +115,72 @@ SubstructTemplateConfig selectTemplateConfig(int maxTargetAtoms, int maxQueryAto // Map to config enum if (targetTier == 32) { if (queryTier == 16) { - if (bondConfig == 4) + if (bondConfig == 4) { return SubstructTemplateConfig::Config_T32_Q16_B4; - if (bondConfig == 6) + } + if (bondConfig == 6) { return SubstructTemplateConfig::Config_T32_Q16_B6; + } return SubstructTemplateConfig::Config_T32_Q16_B8; } else { // queryTier == 32 - if (bondConfig == 4) + if (bondConfig == 4) { return SubstructTemplateConfig::Config_T32_Q32_B4; - if (bondConfig == 6) + } + if (bondConfig == 6) { return SubstructTemplateConfig::Config_T32_Q32_B6; + } return SubstructTemplateConfig::Config_T32_Q32_B8; } } else if (targetTier == 64) { if (queryTier == 16) { - if (bondConfig == 4) + if (bondConfig == 4) { return SubstructTemplateConfig::Config_T64_Q16_B4; - if (bondConfig == 6) + } + if (bondConfig == 6) { return SubstructTemplateConfig::Config_T64_Q16_B6; + } return SubstructTemplateConfig::Config_T64_Q16_B8; } else if (queryTier == 32) { - if (bondConfig == 4) + if (bondConfig == 4) { return SubstructTemplateConfig::Config_T64_Q32_B4; - if (bondConfig == 6) + } + if (bondConfig == 6) { return SubstructTemplateConfig::Config_T64_Q32_B6; + } return SubstructTemplateConfig::Config_T64_Q32_B8; } else { // queryTier == 64 - if (bondConfig == 4) + if (bondConfig == 4) { return SubstructTemplateConfig::Config_T64_Q64_B4; - if (bondConfig == 6) + } + if (bondConfig == 6) { return SubstructTemplateConfig::Config_T64_Q64_B6; + } return SubstructTemplateConfig::Config_T64_Q64_B8; } } else { // targetTier == 128 if (queryTier == 16) { - if (bondConfig == 4) + if (bondConfig == 4) { return SubstructTemplateConfig::Config_T128_Q16_B4; - if (bondConfig == 6) + } + if (bondConfig == 6) { return SubstructTemplateConfig::Config_T128_Q16_B6; + } return SubstructTemplateConfig::Config_T128_Q16_B8; } else if (queryTier == 32) { - if (bondConfig == 4) + if (bondConfig == 4) { return SubstructTemplateConfig::Config_T128_Q32_B4; - if (bondConfig == 6) + } + if (bondConfig == 6) { return SubstructTemplateConfig::Config_T128_Q32_B6; + } return SubstructTemplateConfig::Config_T128_Q32_B8; } else { // queryTier == 64 - if (bondConfig == 4) + if (bondConfig == 4) { return SubstructTemplateConfig::Config_T128_Q64_B4; - if (bondConfig == 6) + } + if (bondConfig == 6) { return SubstructTemplateConfig::Config_T128_Q64_B6; + } return SubstructTemplateConfig::Config_T128_Q64_B8; } } diff --git a/src/substruct/substruct_search_internal.cpp b/src/substruct/substruct_search_internal.cpp index 3f36a096..ff7ec01f 100644 --- a/src/substruct/substruct_search_internal.cpp +++ b/src/substruct/substruct_search_internal.cpp @@ -191,8 +191,9 @@ RDKitFallbackQueue::RDKitFallbackQueue(const std::vector* t maxMatches_(maxMatches) {} void RDKitFallbackQueue::enqueue(const std::vector& entries) { - if (entries.empty()) + if (entries.empty()) { return; + } queue_.pushBatch(entries); } diff --git a/src/substruct/substruct_search_internal.h b/src/substruct/substruct_search_internal.h index 76d605d0..705a2edc 100644 --- a/src/substruct/substruct_search_internal.h +++ b/src/substruct/substruct_search_internal.h @@ -259,12 +259,14 @@ class RDKitFallbackQueue { class FallbackQueueProducerGuard { public: explicit FallbackQueueProducerGuard(RDKitFallbackQueue* queue) : queue_(queue) { - if (queue_) + if (queue_) { queue_->registerProducer(); + } } ~FallbackQueueProducerGuard() { - if (queue_) + if (queue_) { queue_->unregisterProducer(); + } } FallbackQueueProducerGuard(const FallbackQueueProducerGuard&) = delete; FallbackQueueProducerGuard& operator=(const FallbackQueueProducerGuard&) = delete; diff --git a/src/tfd/tfd_common.cpp b/src/tfd/tfd_common.cpp index 29e2de26..39daf04f 100644 --- a/src/tfd/tfd_common.cpp +++ b/src/tfd/tfd_common.cpp @@ -84,12 +84,12 @@ const RDKit::Atom* doMatchExcept1(const std::vector& inv, const s std::vector getAtomInvariantsWithRadius(const RDKit::ROMol& mol, int radius) { std::vector inv(mol.getNumAtoms(), 0); - auto fpGen = RDKit::MorganFingerprint::getMorganGenerator(radius, - false /* countSimulation */, - false /* includeChirality */, - true /* useBondTypes */, - false /* onlyNonzeroInvariants */, - true /* includeRedundantEnvironments */); + auto* fpGen = RDKit::MorganFingerprint::getMorganGenerator(radius, + false /* countSimulation */, + false /* includeChirality */, + true /* useBondTypes */, + false /* onlyNonzeroInvariants */, + true /* includeRedundantEnvironments */); RDKit::AdditionalOutput ao; ao.allocateBitInfoMap(); @@ -154,8 +154,9 @@ std::vector getBondsForTorsions(const RDKit::ROMol& mol, bool ignoreCo // Flag allene centers: carbon atoms with exactly two double bonds for (const auto* atom : mol.atoms()) { - if (atom->getAtomicNum() != 6) + if (atom->getAtomicNum() != 6) { continue; + } int doubleBondCount = 0; for (const auto* bond : mol.atomBonds(atom)) { if (bond->getBondTypeAsDouble() == 2.0) { @@ -190,9 +191,9 @@ std::vector getBondsForTorsions(const RDKit::ROMol& mol, bool ignoreCo if (!ignoreColinearBonds) { // Search for alternative atoms (following the Python logic) while (nb1.size() == 1 && atomFlags[a1]) { - int a1old = a1; - a1 = nb1[0]->getIdx(); - auto* b = mol.getBondBetweenAtoms(a1old, a1); + int a1old = a1; + a1 = nb1[0]->getIdx(); + const auto* b = mol.getBondBetweenAtoms(a1old, a1); if (b) { if (b->getEndAtomIdx() == static_cast(a1old)) { nb1 = getHeavyAtomNeighbors(b->getBeginAtom(), a1old); @@ -205,9 +206,9 @@ std::vector getBondsForTorsions(const RDKit::ROMol& mol, bool ignoreCo } } while (nb2.size() == 1 && atomFlags[a2]) { - int a2old = a2; - a2 = nb2[0]->getIdx(); - auto* b = mol.getBondBetweenAtoms(a2old, a2); + int a2old = a2; + a2 = nb2[0]->getIdx(); + const auto* b = mol.getBondBetweenAtoms(a2old, a2); if (b) { if (b->getBeginAtomIdx() == static_cast(a2old)) { nb2 = getHeavyAtomNeighbors(b->getEndAtom(), a2old); @@ -482,8 +483,8 @@ static std::vector computeTorsionWeightsImpl(const RDKit::ROMol& } // Calculate weights for ring torsions - auto ringInfo = mol.getRingInfo(); - auto bondRings = ringInfo->bondRings(); + auto* ringInfo = mol.getRingInfo(); + auto bondRings = ringInfo->bondRings(); for (const auto& bondRing : bondRings) { int num = static_cast(bondRing.size()); @@ -561,8 +562,9 @@ static TFDSystemHost buildTFDSystemImpl(const RDKit::ROMol& mol, const TFDComput torsionIdx++; continue; } - for (const auto& q : torsion.atomQuartets) + for (const auto& q : torsion.atomQuartets) { system.torsionAtoms.push_back(q); + } system.quartetStarts.push_back(static_cast(system.torsionAtoms.size())); system.torsionTypes.push_back(torsion.atomQuartets.size() > 1 ? TorsionType::Symmetric : TorsionType::Single); system.torsionMaxDevs.push_back(torsion.maxDev); @@ -576,8 +578,9 @@ static TFDSystemHost buildTFDSystemImpl(const RDKit::ROMol& mol, const TFDComput torsionIdx++; continue; } - for (const auto& q : torsion.atomQuartets) + for (const auto& q : torsion.atomQuartets) { system.torsionAtoms.push_back(q); + } system.quartetStarts.push_back(static_cast(system.torsionAtoms.size())); system.torsionTypes.push_back(torsion.atomQuartets.size() > 1 ? TorsionType::Ring : TorsionType::Single); system.torsionMaxDevs.push_back(torsion.maxDev); @@ -674,8 +677,9 @@ static MolExtraction extractMolData(const RDKit::ROMol& mol, const TFDComputeOpt torsionIdx++; return; } - for (const auto& q : torsion.atomQuartets) + for (const auto& q : torsion.atomQuartets) { ext.atoms.push_back(q); + } ext.qStarts.push_back(static_cast(ext.atoms.size())); if (isRing) { ext.types.push_back(torsion.atomQuartets.size() > 1 ? TorsionType::Ring : TorsionType::Single); @@ -688,10 +692,12 @@ static MolExtraction extractMolData(const RDKit::ROMol& mol, const TFDComputeOpt torsionIdx++; }; - for (const auto& t : ext.torsionList.nonRingTorsions) + for (const auto& t : ext.torsionList.nonRingTorsions) { addTorsion(t, false); - for (const auto& t : ext.torsionList.ringTorsions) + } + for (const auto& t : ext.torsionList.ringTorsions) { addTorsion(t, true); + } ext.numTorsions = static_cast(ext.wts.size()); ext.numQuartets = static_cast(ext.atoms.size()); diff --git a/src/tfd/tfd_cpu.cpp b/src/tfd/tfd_cpu.cpp index ad259059..57b0603c 100644 --- a/src/tfd/tfd_cpu.cpp +++ b/src/tfd/tfd_cpu.cpp @@ -78,10 +78,12 @@ double TFDCpuGenerator::computeTFDPair(const float* anglesI, torsIdx++; }; - for (const auto& t : torsionList.nonRingTorsions) + for (const auto& t : torsionList.nonRingTorsions) { processTorsion(t, false); - for (const auto& t : torsionList.ringTorsions) + } + for (const auto& t : torsionList.ringTorsions) { processTorsion(t, true); + } return (sumWeights > 1e-10) ? (sumWeightedDev / sumWeights) : 0.0; } @@ -89,10 +91,12 @@ double TFDCpuGenerator::computeTFDPair(const float* anglesI, std::vector TFDCpuGenerator::computeDihedralAngles(const RDKit::ROMol& mol, const TorsionList& torsionList) { int numConformers = mol.getNumConformers(); int totalQuartets = 0; - for (const auto& t : torsionList.nonRingTorsions) + for (const auto& t : torsionList.nonRingTorsions) { totalQuartets += static_cast(t.atomQuartets.size()); - for (const auto& t : torsionList.ringTorsions) + } + for (const auto& t : torsionList.ringTorsions) { totalQuartets += static_cast(t.atomQuartets.size()); + } if (totalQuartets == 0 || numConformers == 0) { return {}; @@ -103,12 +107,16 @@ std::vector TFDCpuGenerator::computeDihedralAngles(const RDKit::ROMol& mo // Collect all quartets into a flat list for indexed access std::vector*> allQuartets; allQuartets.reserve(totalQuartets); - for (const auto& t : torsionList.nonRingTorsions) - for (const auto& q : t.atomQuartets) + for (const auto& t : torsionList.nonRingTorsions) { + for (const auto& q : t.atomQuartets) { allQuartets.push_back(&q); - for (const auto& t : torsionList.ringTorsions) - for (const auto& q : t.atomQuartets) + } + } + for (const auto& t : torsionList.ringTorsions) { + for (const auto& q : t.atomQuartets) { allQuartets.push_back(&q); + } + } int numAtoms = mol.getNumAtoms(); int confIdx = 0; diff --git a/src/utils/device.cpp b/src/utils/device.cpp index ad6336f2..7efcb9c1 100644 --- a/src/utils/device.cpp +++ b/src/utils/device.cpp @@ -79,7 +79,7 @@ bool streamIsOnCurrentDevice(cudaStream_t stream) { std::optional acquireExternalStream(std::uintptr_t streamPtr) { // External APIs transport the opaque CUDA stream handle as an integer. // NOLINTNEXTLINE(performance-no-int-to-ptr) - auto stream = reinterpret_cast(streamPtr); + auto* stream = reinterpret_cast(streamPtr); if (streamPtr == 0) { return stream; } diff --git a/src/utils/device_vector.h b/src/utils/device_vector.h index 1cb1bbc6..e07642ef 100644 --- a/src/utils/device_vector.h +++ b/src/utils/device_vector.h @@ -263,7 +263,7 @@ template cuda::std::span toSpan(AsyncDeviceVector& vec) { return cuda::std::span(vec.data(), vec.size()); } -template const cuda::std::span toSpan(const AsyncDeviceVector& vec) { +template cuda::std::span toSpan(const AsyncDeviceVector& vec) { assert(vec.size() > 0); return cuda::std::span(vec.data(), vec.size()); } From 0c76ec9a7033d5c08396147d90e6c34c994943ea Mon Sep 17 00:00:00 2001 From: Kevin Boyd Date: Mon, 21 Sep 2026 21:17:44 -0400 Subject: [PATCH 2/2] Preserve Clang 15 typename compatibility --- .clang-tidy | 1 - src/data_structures/flat_bit_vect.h | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.clang-tidy b/.clang-tidy index cea8551b..faeb86c8 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -38,7 +38,6 @@ Checks: - readability-misplaced-array-index - readability-qualified-auto - readability-redundant-casting - - readability-redundant-typename - readability-reference-to-constructed-temporary - readability-uniqueptr-delete-release WarningsAsErrors: '*' diff --git a/src/data_structures/flat_bit_vect.h b/src/data_structures/flat_bit_vect.h index 97dfe953..a64c5bef 100644 --- a/src/data_structures/flat_bit_vect.h +++ b/src/data_structures/flat_bit_vect.h @@ -104,7 +104,7 @@ template struct FlatBitVectStorage { //! In-memory bitvect. template class FlatBitVect { public: - using StorageType = detail::FlatBitVectStorage::StorageType; + using StorageType = typename detail::FlatBitVectStorage::StorageType; constexpr static std::size_t kNBits = detail::FlatBitVectStorage::kNBits; constexpr static std::size_t kStorageBytes = detail::FlatBitVectStorage::kStorageBytes; constexpr static std::size_t kStorageBits = detail::FlatBitVectStorage::kStorageBits;