Enhance -Wc++14-compat for class template argument deduction to list the

deduced type (if known).

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@341858 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Richard Smith 2018-09-10 20:31:03 +00:00
parent 86148aee51
commit 5bd39424d4
3 changed files with 14 additions and 8 deletions

View File

@ -2153,7 +2153,8 @@ def note_deduction_guide_access : Note<
"deduction guide declared %0 by intervening access specifier">;
def warn_cxx14_compat_class_template_argument_deduction : Warning<
"class template argument deduction is incompatible with C++ standards "
"before C++17">, InGroup<CXXPre17Compat>, DefaultIgnore;
"before C++17%select{|; for compatibility, use explicit type name %1}0">,
InGroup<CXXPre17Compat>, DefaultIgnore;
// C++14 deduced return types
def err_auto_fn_deduction_failure : Error<

View File

@ -9139,13 +9139,13 @@ QualType Sema::DeduceTemplateSpecializationFromInitializer(
return QualType();
}
Diag(TSInfo->getTypeLoc().getBeginLoc(),
diag::warn_cxx14_compat_class_template_argument_deduction)
<< TSInfo->getTypeLoc().getSourceRange();
// Can't deduce from dependent arguments.
if (Expr::hasAnyTypeDependentArguments(Inits))
if (Expr::hasAnyTypeDependentArguments(Inits)) {
Diag(TSInfo->getTypeLoc().getBeginLoc(),
diag::warn_cxx14_compat_class_template_argument_deduction)
<< TSInfo->getTypeLoc().getSourceRange() << 0;
return Context.DependentTy;
}
// FIXME: Perform "exact type" matching first, per CWG discussion?
// Or implement this via an implied 'T(T) -> T' deduction guide?
@ -9348,5 +9348,10 @@ QualType Sema::DeduceTemplateSpecializationFromInitializer(
// C++ [dcl.type.class.deduct]p1:
// The placeholder is replaced by the return type of the function selected
// by overload resolution for class template deduction.
return SubstAutoType(TSInfo->getType(), Best->Function->getReturnType());
QualType DeducedType =
SubstAutoType(TSInfo->getType(), Best->Function->getReturnType());
Diag(TSInfo->getTypeLoc().getBeginLoc(),
diag::warn_cxx14_compat_class_template_argument_deduction)
<< TSInfo->getTypeLoc().getSourceRange() << 1 << DeducedType;
return DeducedType;
}

View File

@ -16,7 +16,7 @@ namespace [[]] NS_with_attr {} // expected-warning {{incompatible with C++ stand
enum { e [[]] }; // expected-warning {{incompatible with C++ standards before C++17}}
template<typename T = int> struct X {};
X x; // expected-warning {{class template argument deduction is incompatible with C++ standards before C++17}}
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