On 08/12/2022 19:45, Jason Merrill via Gcc-patches wrote:
Tested x86_64-pc-linux-gnu, applying to trunk.
Bisecting shows this started to break
$ cat test.cc
#include <initializer_list>
template<typename> struct ConstCharArrayDetector;
template<int N> struct ConstCharArrayDetector<char const[N]> { using Type =
int; };
struct OUString {
template<typename T> OUString(T &, typename ConstCharArrayDetector<T>::Type
= 0);
};
struct Sequence { Sequence(std::initializer_list<OUString>); };
Sequence f() { return {""}; }
$ g++ -fsyntax-only test.cc
test.cc: In function ‘Sequence f()’:
test.cc:8:26: error: no matching function for call to ‘OUString::OUString(const
char* const)’
8 | Sequence f() { return {""}; }
| ^
test.cc:5:26: note: candidate: ‘template<class T> OUString::OUString(T&, typename
ConstCharArrayDetector<T>::Type)’
5 | template<typename T> OUString(T &, typename
ConstCharArrayDetector<T>::Type = 0);
| ^~~~~~~~
test.cc:5:26: note: template argument deduction/substitution failed:
test.cc: In substitution of ‘template<class T> OUString::OUString(T&, typename
ConstCharArrayDetector<T>::Type) [with T = const char* const]’:
test.cc:8:26: required from here
test.cc:5:26: error: invalid use of incomplete type ‘struct
ConstCharArrayDetector<const char* const>’
test.cc:2:27: note: declaration of ‘struct ConstCharArrayDetector<const char*
const>’
2 | template<typename> struct ConstCharArrayDetector;
| ^~~~~~~~~~~~~~~~~~~~~~
test.cc:4:8: note: candidate: ‘constexpr OUString::OUString(const OUString&)’
4 | struct OUString {
| ^~~~~~~~
test.cc:4:8: note: no known conversion for argument 1 from ‘const char* const’ to
‘const OUString&’
test.cc:4:8: note: candidate: ‘constexpr OUString::OUString(OUString&&)’
test.cc:4:8: note: no known conversion for argument 1 from ‘const char* const’ to
‘OUString&&’
test.cc:8:26: error: conversion from ‘const char* const’ to non-scalar type
‘const OUString’ requested
8 | Sequence f() { return {""}; }
| ^