Author: Balázs Kéri Date: 2026-05-26T09:24:10+02:00 New Revision: d06d3a7bdca153c3130704ef115c72095488e1f7
URL: https://github.com/llvm/llvm-project/commit/d06d3a7bdca153c3130704ef115c72095488e1f7 DIFF: https://github.com/llvm/llvm-project/commit/d06d3a7bdca153c3130704ef115c72095488e1f7.diff LOG: [clang][ASTImporter] Fix of crash at ConstraintSatisfaction import (#197407) Null pointer dereference could happen during `ASTImporter` import of a `ConstraintSatisfaction` object. Added: clang/test/Analysis/ctu/constraintsatisfaction.cpp Modified: clang/lib/AST/ASTImporter.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp index f8527af2bfe6f..0d8243a6bd74b 100644 --- a/clang/lib/AST/ASTImporter.cpp +++ b/clang/lib/AST/ASTImporter.cpp @@ -1079,6 +1079,11 @@ Error ASTNodeImporter::ImportConstraintSatisfaction( if (!ToSecondExpr) return ToSecondExpr.takeError(); ToSat.Details.emplace_back(ToSecondExpr.get()); + } else if (auto CR = Record->dyn_cast<const ConceptReference *>()) { + Expected<ConceptReference *> ToCROrErr = import(CR); + if (!ToCROrErr) + return ToCROrErr.takeError(); + ToSat.Details.emplace_back(ToCROrErr.get()); } else { auto Pair = Record->dyn_cast<const ConstraintSubstitutionDiagnostic *>(); diff --git a/clang/test/Analysis/ctu/constraintsatisfaction.cpp b/clang/test/Analysis/ctu/constraintsatisfaction.cpp new file mode 100644 index 0000000000000..1517ace7f462a --- /dev/null +++ b/clang/test/Analysis/ctu/constraintsatisfaction.cpp @@ -0,0 +1,48 @@ +// RUN: rm -rf %t +// RUN: mkdir -p %t/ctudir +// RUN: split-file %s %t + +// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -std=c++20 \ +// RUN: -emit-pch -o %t/ctudir/import.cpp.ast %t/import.cpp +// RUN: %clang_analyze_cc1 -triple x86_64-pc-linux-gnu -std=c++20 \ +// RUN: -analyzer-checker=core \ +// RUN: -analyzer-config experimental-enable-naive-ctu-analysis=true \ +// RUN: -analyzer-config ctu-dir=%t/ctudir \ +// RUN: -verify %t/main.cpp + +//--- main.cpp + +// expected-no-diagnostics + +template <typename T> +concept Sizable = requires(T t) { t.size(); }; + +template <typename T> +concept Container = Sizable<T> && requires(T t) { t.begin(); }; + +template <bool> struct BoolConstant {}; +using FalseCheck = BoolConstant<Container<int>>; + +void importee(); +void caller() { importee(); } // no-crash + +//--- import.cpp + +// Check that importing this code does not cause crash. + +template <typename T> +concept Sizable = requires(T t) { t.size(); }; + +template <typename T> +concept Container = Sizable<T> && requires(T t) { t.begin(); }; + +template <bool> struct BoolConstant {}; +using FalseCheck = BoolConstant<Container<int>>; + +void importee() { + FalseCheck f{}; + (void)f; +} + +//--- ctudir/externalDefMap.txt +14:c:@F@importee# import.cpp.ast _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
