diff options
author | Hans Wennborg <hans@hanshq.net> | 2013-12-11 17:42:11 +0000 |
---|---|---|
committer | Hans Wennborg <hans@hanshq.net> | 2013-12-11 17:42:11 +0000 |
commit | 2545efe20c2dbcc210573a51fe94c7fd57482e7c (patch) | |
tree | 46667c4ca79a9df5a3426575febf702e0dca9415 | |
parent | 439e8f9e384403ac47a1cf2ace497998eddb2b67 (diff) | |
download | bcm5719-llvm-2545efe20c2dbcc210573a51fe94c7fd57482e7c.tar.gz bcm5719-llvm-2545efe20c2dbcc210573a51fe94c7fd57482e7c.zip |
Better diagnostic for static override when methods are thiscall by default
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
llvm-svn: 197055
-rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 7 | ||||
-rw-r--r-- | clang/test/SemaCXX/virtual-override.cpp | 3 |
2 files changed, 9 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 1a4ced78708..76623a90d56 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -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(); diff --git a/clang/test/SemaCXX/virtual-override.cpp b/clang/test/SemaCXX/virtual-override.cpp index b477438ee98..48444a65aed 100644 --- a/clang/test/SemaCXX/virtual-override.cpp +++ b/clang/test/SemaCXX/virtual-override.cpp @@ -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 { |