r175890 - Fix MergeFunctionDecl implicit CC for static methods.

David Blaikie dblaikie at gmail.com
Fri Feb 22 08:54:14 PST 2013


On Fri, Feb 22, 2013 at 4:42 AM, Timur Iskhodzhanov <timurrrr at google.com>wrote:

> Author: timurrrr
> Date: Fri Feb 22 06:42:50 2013
> New Revision: 175890
>
> URL: http://llvm.org/viewvc/llvm-project?rev=175890&view=rev
> Log:
> Fix MergeFunctionDecl implicit CC for static methods.
>
> Patch by Alexander Zinenko!
>
>
> Added:
>     cfe/trunk/test/SemaCXX/decl-microsoft-call-conv.cpp   (with props)
> Modified:
>     cfe/trunk/lib/Sema/SemaDecl.cpp
>
> Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=175890&r1=175889&r2=175890&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDecl.cpp Fri Feb 22 06:42:50 2013
> @@ -2328,9 +2328,10 @@ bool Sema::MergeFunctionDecl(FunctionDec
>      RequiresAdjustment = true;
>
>    // Don't complain about mismatches when the default CC is
> -  // effectively the same as the explict one.
> +  // effectively the same as the explict one. Only Old decl contains
> correct
> +  // information about storage class of CXXMethod.
>    } else if (OldTypeInfo.getCC() == CC_Default &&
> -             isABIDefaultCC(*this, NewTypeInfo.getCC(), New)) {
> +             isABIDefaultCC(*this, NewTypeInfo.getCC(), Old)) {
>      NewTypeInfo = NewTypeInfo.withCallingConv(OldTypeInfo.getCC());
>      RequiresAdjustment = true;
>
>
> Added: cfe/trunk/test/SemaCXX/decl-microsoft-call-conv.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/decl-microsoft-call-conv.cpp?rev=175890&view=auto
>
> ==============================================================================
> --- cfe/trunk/test/SemaCXX/decl-microsoft-call-conv.cpp (added)
> +++ cfe/trunk/test/SemaCXX/decl-microsoft-call-conv.cpp Fri Feb 22
> 06:42:50 2013
> @@ -0,0 +1,86 @@
> +// RUN: %clang_cc1 -triple i686-pc-win32 -cxx-abi microsoft
> -fms-extensions -verify %s
> +
> +// Pointers to free functions
> +void            free_func_default();
> +void __cdecl    free_func_cdecl();
> +void __stdcall  free_func_stdcall(); // expected-note {{previous
> declaration is here}}
> +void __fastcall free_func_fastcall(); // expected-note 2 {{previous
> declaration is here}}
> +
> +void __cdecl    free_func_default(); // expected-note 2 {{previous
> declaration is here}}
> +void __stdcall  free_func_default(); // expected-error {{function
> declared 'stdcall' here was previously declared without calling convention}}
> +void __fastcall free_func_default(); // expected-error {{function
> declared 'fastcall' here was previously declared without calling
> convention}}
> +
> +void            free_func_cdecl(); // expected-note 2 {{previous
> declaration is here}}
> +void __stdcall  free_func_cdecl(); // expected-error {{function declared
> 'stdcall' here was previously declared 'cdecl'}}
> +void __fastcall free_func_cdecl(); // expected-error {{function declared
> 'fastcall' here was previously declared 'cdecl'}}
> +
> +void __cdecl    free_func_stdcall(); // expected-error {{function
> declared 'cdecl' here was previously declared 'stdcall'}}
> +void            free_func_stdcall(); // expected-note {{previous
> declaration is here}}
> +void __fastcall free_func_stdcall(); // expected-error {{function
> declared 'fastcall' here was previously declared 'stdcall'}}
> +
> +void __cdecl    free_func_fastcall(); // expected-error {{function
> declared 'cdecl' here was previously declared 'fastcall'}}
> +void __stdcall  free_func_fastcall(); // expected-error {{function
> declared 'stdcall' here was previously declared 'fastcall'}}
> +void            free_func_fastcall();
> +
> +// Overloaded functions may have different calling conventions
> +void __fastcall free_func_default(int);
> +void __cdecl    free_func_default(int *);
> +
> +void __thiscall free_func_cdecl(char *);
> +void __cdecl    free_func_cdecl(double);
> +
> +
> +// Pointers to member functions
> +struct S {
> +  void            member_default1(); // expected-note {{previous
> declaration is here}}
> +  void            member_default2();
> +  void __cdecl    member_cdecl1();
> +  void __cdecl    member_cdecl2(); // expected-note {{previous
> declaration is here}}
> +  void __thiscall member_thiscall1();
> +  void __thiscall member_thiscall2(); // expected-note {{previous
> declaration is here}}
> +
> +  // Static member functions can't be __thiscall
> +  static void            static_member_default1();
> +  static void            static_member_default2(); // expected-note
> {{previous declaration is here}}
> +  static void __cdecl    static_member_cdecl1();
> +  static void __cdecl    static_member_cdecl2(); // expected-note
> {{previous declaration is here}}
> +  static void __stdcall  static_member_stdcall1();
> +  static void __stdcall  static_member_stdcall2();
> +
> +  // Variadic functions can't be other than default or __cdecl
> +  void            member_variadic_default(int x, ...);
> +  void __cdecl    member_variadic_cdecl(int x, ...);
> +
> +  static void            static_member_variadic_default(int x, ...);
> +  static void __cdecl    static_member_variadic_cdecl(int x, ...);
> +};
> +
> +void __cdecl    S::member_default1() {} // expected-error {{function
> declared 'cdecl' here was previously declared without calling convention}}
> +void __thiscall S::member_default2() {}
> +
> +void            S::member_cdecl1() {}
> +void __thiscall S::member_cdecl2() {} // expected-error {{function
> declared 'thiscall' here was previously declared 'cdecl'}}
> +
> +void            S::member_thiscall1() {}
> +void __cdecl    S::member_thiscall2() {} // expected-error {{function
> declared 'cdecl' here was previously declared 'thiscall'}}
> +
> +void __cdecl    S::static_member_default1() {}
> +void __stdcall  S::static_member_default2() {} // expected-error
> {{function declared 'stdcall' here was previously declared without calling
> convention}}
> +
> +void            S::static_member_cdecl1() {}
> +void __stdcall  S::static_member_cdecl2() {} // expected-error {{function
> declared 'stdcall' here was previously declared 'cdecl'}}
> +
> +void __cdecl    S::member_variadic_default(int x, ...) {
> +  (void)x;
> +}
> +void            S::member_variadic_cdecl(int x, ...) {
> +  (void)x;
> +}
> +
> +void __cdecl    S::static_member_variadic_default(int x, ...) {
> +  (void)x;
> +}
> +void            S::static_member_variadic_cdecl(int x, ...) {
> +  (void)x;
> +}
> +
>
> Propchange: cfe/trunk/test/SemaCXX/decl-microsoft-call-conv.cpp
>
> ------------------------------------------------------------------------------
>     svn:eol-style = LF


Might want to check what's causing this in your svn client - we'd usually
just leave the property unspecified I think.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130222/496cbafd/attachment.html>


More information about the cfe-commits mailing list