[libcxx-commits] [clang] [libcxx] [Clang] Normalize constraints before checking for satisfaction (PR #141776)
Erich Keane via libcxx-commits
libcxx-commits at lists.llvm.org
Thu Sep 18 11:14:51 PDT 2025
================
@@ -10,11 +10,68 @@
//
//===----------------------------------------------------------------------===//
+/*
+ * A note on implementation:
+ *
+ * As per the C++ standard, constraints are normalized [temp.constr.normal]
+ * and the normal form is used both for subsumption, and constraint checking.
+ * Both depend on a parameter mapping that substitutes lazily. In particular,
+ * we should not substitute in unused arguments.
+ *
+ * Clang follows the order of operations prescribed by the standard.
+ *
+ * Normalization happens prior to satisfaction and subsumption
+ * and is handled by `NormalizedConstraint`.
+ *
+ * Clang preserves in the normalized form intermediate concept-ids
+ * (ConceptIdConstraint) This is used for diagnostics only and no substitution
+ * happens in a ConceptIdConstraint if its expression is satisfied.
+ *
+ * The normal form of the associated constraints of a declaration is cached in
+ * Sema::NormalizationCache such that it is only computed once.
+ *
+ * a `NormalizedConstraint` is a recursive data structure, where each node
+ * contains a parameter maping, represented by the indexes of all parameter
+ * being used.
+ *
+ * Checking satisfaction is done by ConstraintSatisfactionChecker, recursively
+ * walking NormalizedConstraint. At each level, we substitute the outermost
+ * level of the template arguments referenced in the parameter mapping of a
+ * normalized expression (MultiLevelTemplateArgumentList).
+ *
+ * template <typename T>
+ * concept A = __is_same(T, int);
+ *
+ * template <typename U>
+ * concept B = A<U> && __is_same(U, int);
+ *
+ * The normal form of b is is `__is_same(T, int) /T->U, innermost level/
----------------
erichkeane wrote:
```suggestion
* The normal form of B is is `__is_same(T, int) /T->U, innermost level/
```
https://github.com/llvm/llvm-project/pull/141776
More information about the libcxx-commits
mailing list