rsmith added inline comments.
================ Comment at: test/SemaCXX/unknown-type-name.cpp:1 -// RUN: %clang_cc1 -fsyntax-only -verify %s -// RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s -// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s +// RUN: %clang_cc1 -Wc++2a-compat -fsyntax-only -verify %s +// RUN: %clang_cc1 -Wc++2a-compat -fsyntax-only -verify -std=c++98 %s ---------------- rsmith wrote: > Several of the changes in this file look wrong to me. Specifics below. ================ Comment at: test/SemaCXX/unknown-type-name.cpp:50 template<typename T> -void f(T::type) { } // expected-error{{missing 'typename'}} +void f(T::type) { } // expected-warning {{implicit 'typename' is a C++2a extension}} ---------------- This is wrong. ``` template<typename T> X f(T::type); ``` declares a variable template. This would be valid if the name `f` were a //qualified-id//, and lookup for `f` found a function template, though. (Same for the next 7 cases.) ================ Comment at: test/SemaCXX/unknown-type-name.cpp:95-96 -template<typename T> int h(T::type, int); // expected-error{{missing 'typename'}} -template<typename T> int h(T::type x, char); // expected-error{{missing 'typename'}} +template<typename T> int h(T::type, int); // expected-warning {{implicit 'typename' is a C++2a extension}} +template<typename T> int h(T::type x, char); // expected-warning {{implicit 'typename' is a C++2a extension}} ---------------- No implicit `typename` for these two (but the previous two are fine). ================ Comment at: test/SemaCXX/unknown-type-name.cpp:102-103 #endif -template<typename T> int junk2(T::junk) throw(); // expected-error{{missing 'typename'}} -template<typename T> int junk3(T::junk) = delete; // expected-error{{missing 'typename'}} +template<typename T> int junk2(T::junk) throw(); // expected-warning {{implicit 'typename' is a C++2a extension}} +template<typename T> int junk3(T::junk) = delete; // expected-warning {{implicit 'typename' is a C++2a extension}} #if __cplusplus <= 199711L ---------------- These two are incorrect. ================ Comment at: test/SemaCXX/unknown-type-name.cpp:108 -template<typename T> int junk4(T::junk j); // expected-error{{missing 'typename'}} +template<typename T> int junk4(T::junk j); // expected-warning {{implicit 'typename' is a C++2a extension}} ---------------- This one is incorrect. ================ Comment at: test/SemaCXX/unknown-type-name.cpp:121-122 template<typename T> -A<T>::g() { } // expected-error{{requires a type specifier}} +A<T>::g() { } // expected-error{{expected unqualified-id}} +// expected-warning@-1{{implicit 'typename' is a C++2a extension}} ---------------- This is a diagnostic quality regression. Perhaps that's an inevitable consequence of P0634, but we should at least try to do better. Repository: rC Clang https://reviews.llvm.org/D53847 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits