Quuxplusone updated this revision to Diff 174449. Quuxplusone added a comment.
Added a test case (partly copied from `test/SemaCXX/cxx14-compat.cpp`). On the last warning in the file, I omitted the sketchy part of the warning, which on Godbolt looks like this: https://godbolt.org/z/CB4z99 <source>:7:5: warning: class template argument deduction is incompatible with C++ standards before C++17; for compatibility, use explicit type name 'V<(lambda at <source>:6:16)>' [-Wc++98-c++11-c++14-compat] V v(lam); ^ 1 warning generated. This seems like a bug in the diagnostic, but fixing it is definitely not part of this patch, and probably above my pay grade at the moment anyway. :) Repository: rC Clang https://reviews.llvm.org/D54565 Files: include/clang/Basic/DiagnosticGroups.td include/clang/Basic/DiagnosticSemaKinds.td test/SemaCXX/cxx14-compat-ctad.cpp Index: test/SemaCXX/cxx14-compat-ctad.cpp =================================================================== --- /dev/null +++ test/SemaCXX/cxx14-compat-ctad.cpp @@ -0,0 +1,31 @@ +// RUN: %clang_cc1 -fsyntax-only -std=c++17 -Wc++14-compat-ctad -verify %s +// RUN: %clang_cc1 -fsyntax-only -std=c++2a -Wc++14-compat-ctad -verify %s + +template<typename T = int> struct X {}; +X x; // expected-warning {{class template argument deduction is incompatible with C++ standards before C++17; for compatibility, use explicit type name 'X<int>'}} + +template<template<typename> class> struct Y {}; +Y<X> yx; // ok, not class template argument deduction + +template<typename T> void f(T t) { + X x = t; // expected-warning {{class template argument deduction is incompatible with C++ standards before C++17}} +} + +template<typename T> void g(T t) { + typename T::X x = t; // expected-warning {{class template argument deduction is incompatible with C++ standards before C++17; for compatibility, use explicit type name 'typename A::X<A>' (aka 'A::X<A>')}} +} + +struct A { template<typename T> struct X { X(T); }; }; +void h(A a) { g(a); } // expected-note {{in instantiation of function template specialization 'g<A>'}} + +template<class T> struct V { V(const T&) {} }; + +V(int) -> V<int*>; // ok, deduction guide is not a use of class template argument deduction + +void f2() { V v('a'); } // expected-warning {{class template argument deduction is incompatible with C++ standards before C++17; for compatibility, use explicit type name 'V<char>'}} +void g2() { V v(0); } // expected-warning {{class template argument deduction is incompatible with C++ standards before C++17; for compatibility, use explicit type name 'V<int *>'}} + +void h2() { + auto lam = [](){}; + V v(lam); // expected-warning {{class template argument deduction is incompatible with C++ standards before C++17}} +} Index: include/clang/Basic/DiagnosticSemaKinds.td =================================================================== --- include/clang/Basic/DiagnosticSemaKinds.td +++ include/clang/Basic/DiagnosticSemaKinds.td @@ -2164,7 +2164,7 @@ def warn_cxx14_compat_class_template_argument_deduction : Warning< "class template argument deduction is incompatible with C++ standards " "before C++17%select{|; for compatibility, use explicit type name %1}0">, - InGroup<CXXPre17Compat>, DefaultIgnore; + InGroup<CXX14CompatCTAD>, DefaultIgnore; // C++14 deduced return types def err_auto_fn_deduction_failure : Error< Index: include/clang/Basic/DiagnosticGroups.td =================================================================== --- include/clang/Basic/DiagnosticGroups.td +++ include/clang/Basic/DiagnosticGroups.td @@ -173,6 +173,7 @@ def InvalidIOSDeploymentTarget : DiagGroup<"invalid-ios-deployment-target">; +def CXX14CompatCTAD : DiagGroup<"c++14-compat-ctad">; def CXX17CompatMangling : DiagGroup<"c++17-compat-mangling">; def : DiagGroup<"c++1z-compat-mangling", [CXX17CompatMangling]>; // Name of this warning in GCC. @@ -183,7 +184,8 @@ def CXXPre14CompatPedantic : DiagGroup<"c++98-c++11-compat-pedantic", [CXXPre14Compat, CXXPre14CompatBinaryLiteral]>; -def CXXPre17Compat : DiagGroup<"c++98-c++11-c++14-compat">; +def CXXPre17Compat : DiagGroup<"c++98-c++11-c++14-compat", + [CXX14CompatCTAD]>; def CXXPre17CompatPedantic : DiagGroup<"c++98-c++11-c++14-compat-pedantic", [CXXPre17Compat]>; def CXXPre2aCompat : DiagGroup<"c++98-c++11-c++14-c++17-compat">;
Index: test/SemaCXX/cxx14-compat-ctad.cpp =================================================================== --- /dev/null +++ test/SemaCXX/cxx14-compat-ctad.cpp @@ -0,0 +1,31 @@ +// RUN: %clang_cc1 -fsyntax-only -std=c++17 -Wc++14-compat-ctad -verify %s +// RUN: %clang_cc1 -fsyntax-only -std=c++2a -Wc++14-compat-ctad -verify %s + +template<typename T = int> struct X {}; +X x; // expected-warning {{class template argument deduction is incompatible with C++ standards before C++17; for compatibility, use explicit type name 'X<int>'}} + +template<template<typename> class> struct Y {}; +Y<X> yx; // ok, not class template argument deduction + +template<typename T> void f(T t) { + X x = t; // expected-warning {{class template argument deduction is incompatible with C++ standards before C++17}} +} + +template<typename T> void g(T t) { + typename T::X x = t; // expected-warning {{class template argument deduction is incompatible with C++ standards before C++17; for compatibility, use explicit type name 'typename A::X<A>' (aka 'A::X<A>')}} +} + +struct A { template<typename T> struct X { X(T); }; }; +void h(A a) { g(a); } // expected-note {{in instantiation of function template specialization 'g<A>'}} + +template<class T> struct V { V(const T&) {} }; + +V(int) -> V<int*>; // ok, deduction guide is not a use of class template argument deduction + +void f2() { V v('a'); } // expected-warning {{class template argument deduction is incompatible with C++ standards before C++17; for compatibility, use explicit type name 'V<char>'}} +void g2() { V v(0); } // expected-warning {{class template argument deduction is incompatible with C++ standards before C++17; for compatibility, use explicit type name 'V<int *>'}} + +void h2() { + auto lam = [](){}; + V v(lam); // expected-warning {{class template argument deduction is incompatible with C++ standards before C++17}} +} Index: include/clang/Basic/DiagnosticSemaKinds.td =================================================================== --- include/clang/Basic/DiagnosticSemaKinds.td +++ include/clang/Basic/DiagnosticSemaKinds.td @@ -2164,7 +2164,7 @@ def warn_cxx14_compat_class_template_argument_deduction : Warning< "class template argument deduction is incompatible with C++ standards " "before C++17%select{|; for compatibility, use explicit type name %1}0">, - InGroup<CXXPre17Compat>, DefaultIgnore; + InGroup<CXX14CompatCTAD>, DefaultIgnore; // C++14 deduced return types def err_auto_fn_deduction_failure : Error< Index: include/clang/Basic/DiagnosticGroups.td =================================================================== --- include/clang/Basic/DiagnosticGroups.td +++ include/clang/Basic/DiagnosticGroups.td @@ -173,6 +173,7 @@ def InvalidIOSDeploymentTarget : DiagGroup<"invalid-ios-deployment-target">; +def CXX14CompatCTAD : DiagGroup<"c++14-compat-ctad">; def CXX17CompatMangling : DiagGroup<"c++17-compat-mangling">; def : DiagGroup<"c++1z-compat-mangling", [CXX17CompatMangling]>; // Name of this warning in GCC. @@ -183,7 +184,8 @@ def CXXPre14CompatPedantic : DiagGroup<"c++98-c++11-compat-pedantic", [CXXPre14Compat, CXXPre14CompatBinaryLiteral]>; -def CXXPre17Compat : DiagGroup<"c++98-c++11-c++14-compat">; +def CXXPre17Compat : DiagGroup<"c++98-c++11-c++14-compat", + [CXX14CompatCTAD]>; def CXXPre17CompatPedantic : DiagGroup<"c++98-c++11-c++14-compat-pedantic", [CXXPre17Compat]>; def CXXPre2aCompat : DiagGroup<"c++98-c++11-c++14-c++17-compat">;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits