[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