зеркало из https://github.com/microsoft/clang-1.git
'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:
Родитель
cb8f951dea
Коммит
9324583ad2
|
@ -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}}
|
||||
|
|
Загрузка…
Ссылка в новой задаче