================
@@ -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
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to