'extern template' is a C++11 feature. Add an Extension for C++98 (this matches

gcc's behaviour), and a -Wc++98-compat-pedantic warning for C++11.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@142597 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Richard Smith 2011-10-20 18:35:58 +00:00
Родитель cb8f951dea
Коммит 9324583ad2
4 изменённых файлов: 12 добавлений и 1 удалений

Просмотреть файл

@ -469,6 +469,11 @@ def err_missing_dependent_template_keyword : Error<
def warn_missing_dependent_template_keyword : ExtWarn<
"use 'template' keyword to treat '%0' as a dependent template name">;
def ext_extern_template : Extension<
"extern templates are a C++11 extension">, InGroup<CXX11>;
def warn_cxx98_compat_extern_template : Warning<
"extern templates are incompatible with C++98">,
InGroup<CXX98CompatPedantic>, DefaultIgnore;
def warn_static_inline_explicit_inst_ignored : Warning<
"ignoring '%select{static|inline}0' keyword on explicit template "
"instantiation">;

Просмотреть файл

@ -642,6 +642,9 @@ Parser::ParseExternalDeclaration(ParsedAttributesWithRange &attrs,
// Extern templates
SourceLocation ExternLoc = ConsumeToken();
SourceLocation TemplateLoc = ConsumeToken();
Diag(ExternLoc, getLang().CPlusPlus0x ?
diag::warn_cxx98_compat_extern_template :
diag::ext_extern_template) << SourceRange(ExternLoc, TemplateLoc);
SourceLocation DeclEnd;
return Actions.ConvertDeclToDeclGroup(
ParseExplicitInstantiation(ExternLoc, TemplateLoc, DeclEnd));

Просмотреть файл

@ -43,6 +43,6 @@ namespace test0 {
// inappropriately instantiating this template.
void *ptr = x;
}
extern template class foo<char>;
extern template class foo<char>; // expected-warning {{extern templates are a C++11 extension}}
template class foo<char>;
}

Просмотреть файл

@ -29,3 +29,6 @@ struct ConvertToInt {
operator int();
};
int *ArraySizeConversion = new int[ConvertToInt()]; // expected-warning {{implicit conversion from array size expression of type 'ConvertToInt' to integral type 'int' is incompatible with C++98}}
template<typename T> class ExternTemplate {};
extern template class ExternTemplate<int>; // expected-warning {{extern templates are incompatible with C++98}}