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

Reply via email to