================ @@ -0,0 +1,65 @@ +// RUN: %clang_cc1 -fsyntax-only -verify -Wno-unused-value -std=c++20 %s + +namespace std { + typedef decltype(sizeof(int)) size_t; + + template <typename E> + struct initializer_list + { + const E *p; + size_t n; + initializer_list(const E *p, size_t n) : p(p), n(n) {} + }; + + struct string { + string(const char *); + }; + + // Classes to use to reproduce the exact scenario present in 62925. +template<class T, class Y> +class pair{ + public: + pair(T f, Y s) {} +}; + +template<class T, class Y> +class map { + public: + map(std::initializer_list<pair<T, Y>>, int a = 4, int b = 5) {} +}; + +} // namespace std + + +// Classes to test different levels of nestings and conversions. +template<class T, class Y> +class Contained { + public: + Contained(T, Y) {} +}; + +template<class T, class Y> +class A { + public: + A(std::initializer_list<Contained<T, Y> >, int) {} +}; + + +// This is the almost the exact code that was in issue #62925. +void testOneLevelNesting() { + std::map mOk = {std::pair{5, 'a'}, {6, 'b'}, {7, 'c'}}; + + // Verify that narrowing conversion is disabled in the first level of nesting. + std::map mNarrow = {std::pair{5, 'a'}, {6.0f, 'b'}, {7, 'c'}}; // expected-error {{type 'float' cannot be narrowed to 'int' in initializer list}} // expected-note {{insert an explicit cast to silence this issue}} +} + +void testMultipleLevelNesting() { + A aOk = {{Contained{5, 'c'}, {5, 'c'}}, 5}; + + // Verify that narrowing conversion is disabled when it is not in a nested + // in another std::initializer_list, but it happens in the most outer one. + A aNarrowNested = {{Contained{5, 'c'}, {5.0f, 'c'}}, 5}; // expected-error {{type 'float' cannot be narrowed to 'int' in initializer list}} // expected-note {{insert an explicit cast to silence this issue}} ---------------- hokein wrote:
Class `Contained` and `pair` look the same (also for `A` and `map`). Can we reuse the `pair` and `map` to test the "mutiple level nesting" case? e.g. `std::map mNaarowNested = {{Contained{5, 'c'}, {5.0f, 'c'}}, 5}};` (you probably need to add a constructor `map(std::initializer_list<pair<T, Y>>, int)`). https://github.com/llvm/llvm-project/pull/94752 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits