diff options
author | Dmitry Polukhin <dmitry.polukhin@gmail.com> | 2016-04-26 09:21:17 +0000 |
---|---|---|
committer | Dmitry Polukhin <dmitry.polukhin@gmail.com> | 2016-04-26 09:21:17 +0000 |
commit | e9b2548f294c902b6431645b1c44667468f180f4 (patch) | |
tree | 8981a60c6fcf3127e4b300b984b90f416cd4878e | |
parent | b2885799d1ebad33dfac3da3f38346177c3f2a43 (diff) | |
download | bcm5719-llvm-e9b2548f294c902b6431645b1c44667468f180f4.tar.gz bcm5719-llvm-e9b2548f294c902b6431645b1c44667468f180f4.zip |
[MSVC] PR27337: allow static_cast from private base to derived for WTL
MSVC doesn't report even warning for cast from private base class to
derived.
Differential Revision: http://reviews.llvm.org/D19477
llvm-svn: 267534
-rw-r--r-- | clang/include/clang/Basic/DiagnosticSemaKinds.td | 3 | ||||
-rw-r--r-- | clang/lib/Sema/SemaCast.cpp | 9 | ||||
-rw-r--r-- | clang/test/SemaCXX/ext_ms_downcast.cpp | 40 |
3 files changed, 48 insertions, 4 deletions
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index f24bf870113..4e2a0349645 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -5764,6 +5764,9 @@ def err_static_downcast_via_virtual : Error< "cannot cast %0 to %1 via virtual base %2">; def err_downcast_from_inaccessible_base : Error< "cannot cast %select{private|protected}2 base class %1 to %0">; +def ext_ms_downcast_from_inaccessible_base : ExtWarn< + "casting from %select{private|protected}2 base class %1 to derived class %0 is a Microsoft extension">, + InGroup<MicrosoftCast>; def err_upcast_to_inaccessible_base : Error< "cannot cast %0 to its %select{private|protected}2 base class %1">; def err_bad_dynamic_cast_not_ref_or_ptr : Error< diff --git a/clang/lib/Sema/SemaCast.cpp b/clang/lib/Sema/SemaCast.cpp index 4a7699b22e2..84a070573f5 100644 --- a/clang/lib/Sema/SemaCast.cpp +++ b/clang/lib/Sema/SemaCast.cpp @@ -1344,10 +1344,11 @@ TryStaticDowncast(Sema &Self, CanQualType SrcType, CanQualType DestType, } if (!CStyle) { - switch (Self.CheckBaseClassAccess(OpRange.getBegin(), - SrcType, DestType, - Paths.front(), - diag::err_downcast_from_inaccessible_base)) { + unsigned Diag = Self.getLangOpts().MSVCCompat + ? diag::ext_ms_downcast_from_inaccessible_base + : diag::err_downcast_from_inaccessible_base; + switch (Self.CheckBaseClassAccess(OpRange.getBegin(), SrcType, DestType, + Paths.front(), Diag)) { case Sema::AR_accessible: case Sema::AR_delayed: // be optimistic case Sema::AR_dependent: // be optimistic diff --git a/clang/test/SemaCXX/ext_ms_downcast.cpp b/clang/test/SemaCXX/ext_ms_downcast.cpp new file mode 100644 index 00000000000..42feeb4b8cf --- /dev/null +++ b/clang/test/SemaCXX/ext_ms_downcast.cpp @@ -0,0 +1,40 @@ +// RUN: %clang_cc1 -fsyntax-only -fms-compatibility -verify %s +// RUN: %clang_cc1 -fsyntax-only -DNO_MS_COMPATIBILITY -verify %s + +// Minimal reproducer. +class A {}; +class B : A {}; // expected-note 2 {{implicitly declared private here}} + +B* foo(A* p) { + return static_cast<B*>(p); +#ifdef NO_MS_COMPATIBILITY + // expected-error@-2 {{cannot cast private base class 'A' to 'B'}} +#else + // expected-warning@-4 {{casting from private base class 'A' to derived class 'B' is a Microsoft extension}} +#endif +} + +A* bar(B* p) { + return static_cast<A*>(p); // expected-error {{cannot cast 'B' to its private base class 'A'}} +} + +// from atlframe.h +template <class T> +class CUpdateUI { +public: + CUpdateUI() { + T* pT = static_cast<T*>(this); +#ifdef NO_MS_COMPATIBILITY + // expected-error@-2 {{cannot cast private base class}} +#else + // expected-warning@-4 {{casting from private base class 'CUpdateUI<CMDIFrame>' to derived class 'CMDIFrame' is a Microsoft extension}} +#endif + } +}; + +// from sample WTL/MDIDocVw (mainfrm.h +class CMDIFrame : CUpdateUI<CMDIFrame> {}; +// expected-note@-1 {{implicitly declared private here}} +// expected-note@-2 {{in instantiation of member function}} + +CMDIFrame wndMain; |