r352219 - Allow 'static' storage specifier on an out-of-line member function template
Roman Lebedev via cfe-commits
cfe-commits at lists.llvm.org
Fri Jan 25 10:08:10 PST 2019
This review is invalid, since the lists weren't subscribed.
On Fri, Jan 25, 2019 at 8:01 PM Erich Keane via cfe-commits
<cfe-commits at lists.llvm.org> wrote:
>
> Author: erichkeane
> Date: Fri Jan 25 09:01:42 2019
> New Revision: 352219
>
> URL: http://llvm.org/viewvc/llvm-project?rev=352219&view=rev
> Log:
> Allow 'static' storage specifier on an out-of-line member function template
> declaration in MSVCCompat mode
>
> Microsoft compiler permits the use of 'static' storage specifier outside
> of a class definition if it's on an out-of-line member function template
> declaration.
>
> This patch allows 'static' storage specifier on an out-of-line member
> function template declaration with a warning in Clang (To be compatible
> with Microsoft).
>
> Intel C/C++ compiler allows the 'static' keyword with a warning in
> Microsoft mode. GCC allows this with -fpermissive.
>
> Patch By: Manna
>
> Differential Revision: https://reviews.llvm.org/D56473
>
> Change-Id: I97b2d9e9d57cecbcd545d17e2523142a85ca2702
>
> Added:
> cfe/trunk/test/SemaCXX/warn-static-outside-class-definition.cpp (with props)
> Modified:
> cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
> cfe/trunk/lib/Sema/SemaDecl.cpp
>
> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=352219&r1=352218&r2=352219&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Fri Jan 25 09:01:42 2019
> @@ -1585,6 +1585,9 @@ def err_explicit_non_ctor_or_conv_functi
> def err_static_not_bitfield : Error<"static member %0 cannot be a bit-field">;
> def err_static_out_of_line : Error<
> "'static' can only be specified inside the class definition">;
> +def ext_static_out_of_line : ExtWarn<
> + err_static_out_of_line.Text>,
> + InGroup<MicrosoftTemplate>;
> def err_storage_class_for_static_member : Error<
> "static data member definition cannot specify a storage class">;
> def err_typedef_not_bitfield : Error<"typedef member %0 cannot be a bit-field">;
>
> Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=352219&r1=352218&r2=352219&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDecl.cpp Fri Jan 25 09:01:42 2019
> @@ -8625,8 +8625,12 @@ Sema::ActOnFunctionDeclarator(Scope *S,
>
> // Complain about the 'static' specifier if it's on an out-of-line
> // member function definition.
> +
> + // MSVC permits the use of a 'static' storage specifier on an out-of-line
> + // member function template declaration, warn about this.
> Diag(D.getDeclSpec().getStorageClassSpecLoc(),
> - diag::err_static_out_of_line)
> + NewFD->getDescribedFunctionTemplate() && getLangOpts().MSVCCompat
> + ? diag::ext_static_out_of_line : diag::err_static_out_of_line)
> << FixItHint::CreateRemoval(D.getDeclSpec().getStorageClassSpecLoc());
> }
>
>
> Added: cfe/trunk/test/SemaCXX/warn-static-outside-class-definition.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/warn-static-outside-class-definition.cpp?rev=352219&view=auto
> ==============================================================================
> --- cfe/trunk/test/SemaCXX/warn-static-outside-class-definition.cpp (added)
> +++ cfe/trunk/test/SemaCXX/warn-static-outside-class-definition.cpp Fri Jan 25 09:01:42 2019
> @@ -0,0 +1,11 @@
> +// RUN: %clang_cc1 -fms-compatibility -fsyntax-only -verify %s
> +
> +struct C {
> + template <typename T> static int foo(T);
> +};
> +
> +template <typename T> static int C::foo(T) {
> + //expected-warning at -1 {{'static' can only be specified inside the class definition}}
> + return 0;
> +}
> +
>
> Propchange: cfe/trunk/test/SemaCXX/warn-static-outside-class-definition.cpp
> ------------------------------------------------------------------------------
> svn:eol-style = native
>
> Propchange: cfe/trunk/test/SemaCXX/warn-static-outside-class-definition.cpp
> ------------------------------------------------------------------------------
> svn:keywords = "Author Date Id Rev URL"
>
> Propchange: cfe/trunk/test/SemaCXX/warn-static-outside-class-definition.cpp
> ------------------------------------------------------------------------------
> svn:mime-type = text/plain
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list