diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2011-10-18 03:44:03 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2011-10-18 03:44:03 +0000 |
commit | 2dc7ece8a83f371cb86c2f93282cb3c8e2d010ec (patch) | |
tree | 1eb886b7aff7460a6c35de454400bd5fb81f65d5 | |
parent | 4e8ea0b2e163aa9681e2f14ad75ab4990a69d39b (diff) |
Add -Wc++11-compat warning for an inline specifier on an explicit instantiation.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@142333 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/Basic/DiagnosticSemaKinds.td | 2 | ||||
-rw-r--r-- | lib/Sema/SemaTemplate.cpp | 6 | ||||
-rw-r--r-- | test/SemaCXX/cxx0x-compat.cpp | 2 |
3 files changed, 8 insertions, 2 deletions
diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index bc3740b49e..354f231171 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -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< diff --git a/lib/Sema/SemaTemplate.cpp b/lib/Sema/SemaTemplate.cpp index 82a88312d7..6e8544ef2f 100644 --- a/lib/Sema/SemaTemplate.cpp +++ b/lib/Sema/SemaTemplate.cpp @@ -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 diff --git a/test/SemaCXX/cxx0x-compat.cpp b/test/SemaCXX/cxx0x-compat.cpp index 4a7c1defee..5bec025b31 100644 --- a/test/SemaCXX/cxx0x-compat.cpp +++ b/test/SemaCXX/cxx0x-compat.cpp @@ -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}} } |