[all-commits] [llvm/llvm-project] c4b72a: [clang] Implement provisional wording for CWG2398 ...

Matheus Izvekov via All-commits all-commits at lists.llvm.org
Wed May 15 17:51:01 PDT 2024


  Branch: refs/heads/users/mizvekov/clang-cwg2398-disambiguate-packs
  Home:   https://github.com/llvm/llvm-project
  Commit: c4b72afa655c0e35005dca8aea18e651189f8938
      https://github.com/llvm/llvm-project/commit/c4b72afa655c0e35005dca8aea18e651189f8938
  Author: Matheus Izvekov <mizvekov at gmail.com>
  Date:   2024-05-15 (Wed, 15 May 2024)

  Changed paths:
    M clang/include/clang/Sema/Sema.h
    M clang/lib/Sema/SemaTemplate.cpp
    M clang/lib/Sema/SemaTemplateDeduction.cpp
    M clang/test/SemaTemplate/cwg2398.cpp

  Log Message:
  -----------
  [clang] Implement provisional wording for CWG2398 regarding packs

This solves some ambuguity introduced in P0522 regarding how
template template parameters are partially ordered, and should reduce
the negative impact of enabling `-frelaxed-template-template-args`
by default.

When performing template argument deduction, a template template parameter
containing no packs should be more specialized than one that does.

Given the following example:
```C++
template<class T2> struct A;
template<template<class ...T3s> class TT1, class T4> struct A<TT1<T4>>; // #1
template<template<class    T5 > class TT2, class T6> struct A<TT2<T6>>; // #2

template<class T1> struct B;
template struct A<B<char>>;
```

Prior to P0522, candidate #2 would be more specialized.
After P0522, neither is more specialized, so this becomes ambiguous.
With this change, #2 becomes more specialized again,
maintaining compatibility with pre-P0522 implementations.

The problem is that in P0522, candidates are at least as specialized
when matching packs to fixed-size lists both ways, whereas before,
a fixed-size list is more specialized.

This patch keeps the original behavior when checking template arguments
outside deduction, but restores this aspect of pre-P0522 matching
during deduction.

---

Since this changes provisional implementation of CWG2398 which has
not been released yet, and already contains a changelog entry,
we don't provide a changelog entry here.



To unsubscribe from these emails, change your notification settings at https://github.com/llvm/llvm-project/settings/notifications


More information about the All-commits mailing list