[temp.explicit]p1: constexpr cannot be specified in explicit instantiations.

llvm-svn: 141982
This commit is contained in:
Richard Smith 2011-10-14 19:58:02 +00:00
parent 450128a68c
commit 465841e48c
3 changed files with 15 additions and 5 deletions

View File

@ -2412,6 +2412,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 err_explicit_instantiation_constexpr : Error<
"explicit instantiation cannot be 'constexpr'">;
def ext_explicit_instantiation_without_qualified_id : Extension<
"qualifier in explicit instantiation of %q0 requires a template-id "
"(a typedef is not permitted)">;

View File

@ -6164,9 +6164,12 @@ DeclResult Sema::ActOnExplicitInstantiation(Scope *S,
if (D.getDeclSpec().isInlineSpecified() && getLangOptions().CPlusPlus0x)
Diag(D.getDeclSpec().getInlineSpecLoc(),
diag::err_explicit_instantiation_inline)
<<FixItHint::CreateRemoval(D.getDeclSpec().getInlineSpecLoc());
// FIXME: check for constexpr specifier.
<< 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
// not already specified.
Diag(D.getDeclSpec().getConstexprSpecLoc(),
diag::err_explicit_instantiation_constexpr);
// C++0x [temp.explicit]p2:
// There are two forms of explicit instantiation: an explicit instantiation

View File

@ -5,6 +5,11 @@ struct X {
void f() {}
};
template inline void X<int>::f(); // expected-error{{'inline'}}
template inline void X<int>::f(); // expected-error{{explicit instantiation cannot be 'inline'}}
// FIXME: test constexpr
template<typename T>
struct Y {
constexpr int f() { return 0; }
};
template constexpr int Y<int>::f(); // expected-error{{explicit instantiation cannot be 'constexpr'}}