]> granicus.if.org Git - clang/commitdiff
Better diagnostic for static override when methods are thiscall by default
authorHans Wennborg <hans@hanshq.net>
Wed, 11 Dec 2013 17:42:11 +0000 (17:42 +0000)
committerHans Wennborg <hans@hanshq.net>
Wed, 11 Dec 2013 17:42:11 +0000 (17:42 +0000)
Methods are thiscall by default in the MS ABI, and also in MinGW targetting GCC 4.7 or later.

This changes the diagnostic from the technically correct but hard to understand:

  virtual function 'foo' has different calling convention attributes ('void ()') than the function it overrides (which has calling convention 'void () __attribute__((thiscall))')

to the more intuitive and also correct:

  'static' member function 'foo' overrides a virtual function

We already have a test for this. Let's just run it in both ABI modes.

Differential Revision: http://llvm-reviews.chandlerc.com/D2375

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@197055 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDeclCXX.cpp
test/SemaCXX/virtual-override.cpp

index 1a4ced787080dc70e6cc5eae33feba1110ab84ed..76623a90d56e2285317a6dbe4a150d88b457f27d 100644 (file)
@@ -12058,6 +12058,13 @@ bool Sema::CheckOverridingFunctionAttributes(const CXXMethodDecl *New,
   if (NewCC == OldCC)
     return false;
 
+  // If the calling conventions mismatch because the new function is static,
+  // suppress the calling convention mismatch error; the error about static
+  // function override (err_static_overrides_virtual from
+  // Sema::CheckFunctionDeclaration) is more clear.
+  if (New->getStorageClass() == SC_Static)
+    return false;
+
   Diag(New->getLocation(),
        diag::err_conflicting_overriding_cc_attributes)
     << New->getDeclName() << New->getType() << Old->getType();
index b477438ee9883ef4347b978134fdf4da4c70dc59..48444a65aed6d12d2edd70487f38366881bb814f 100644 (file)
@@ -1,4 +1,5 @@
-// RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++11
+// RUN: %clang_cc1 -fsyntax-only -cxx-abi itanium -verify %s -std=c++11
+// RUN: %clang_cc1 -fsyntax-only -cxx-abi microsoft -verify %s -std=c++11
 namespace T1 {
 
 class A {