Add -Wc++11-compat warning for an inline specifier on an explicit instantiation.

llvm-svn: 142333
This commit is contained in:
Richard Smith 2011-10-18 03:44:03 +00:00
parent 4c42be5b32
commit 83c19296ff
3 changed files with 8 additions and 2 deletions

View File

@ -2428,6 +2428,8 @@ def note_explicit_instantiation_candidate : Note<
"explicit instantiation candidate function template here %0">;
def err_explicit_instantiation_inline : Error<
"explicit instantiation cannot be 'inline'">;
def warn_explicit_instantiation_inline_0x : Warning<
"explicit instantiation cannot be 'inline'">, InGroup<CXX11Compat>;
def err_explicit_instantiation_constexpr : Error<
"explicit instantiation cannot be 'constexpr'">;
def ext_explicit_instantiation_without_qualified_id : Extension<

View File

@ -6157,9 +6157,11 @@ DeclResult Sema::ActOnExplicitInstantiation(Scope *S,
// inline or constexpr specifiers.
// Presumably, this also applies to member functions of class templates as
// well.
if (D.getDeclSpec().isInlineSpecified() && getLangOptions().CPlusPlus0x)
if (D.getDeclSpec().isInlineSpecified())
Diag(D.getDeclSpec().getInlineSpecLoc(),
diag::err_explicit_instantiation_inline)
getLangOptions().CPlusPlus0x ?
diag::err_explicit_instantiation_inline :
diag::warn_explicit_instantiation_inline_0x)
<< FixItHint::CreateRemoval(D.getDeclSpec().getInlineSpecLoc());
if (D.getDeclSpec().isConstexprSpecified())
// FIXME: Add a fix-it to remove the 'constexpr' and add a 'const' if one is

View File

@ -15,6 +15,8 @@ namespace M {
template void ::g<char>(char); // expected-warning {{explicit instantiation of 'g' must occur at global scope}}
}
template inline void g<double>(double); // expected-warning {{explicit instantiation cannot be 'inline'}}
void g() {
auto int n = 0; // expected-warning {{'auto' storage class specifier is redundant and incompatible with C++11}}
}