Skip to content
Snippets Groups Projects
Commit f847bad1 authored by Dmitry Polukhin's avatar Dmitry Polukhin
Browse files

[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

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@267534 91177308-0d34-0410-b5e6-96231b3b80d8
parent 681515a7
No related branches found
No related tags found
No related merge requests found
......@@ -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<
......
......@@ -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
......
// 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;
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment