Visual Studio 2015 (19.00.23720.0) reports: error C2243: 'static_cast': conversion from 'B *' to 'A *' exists, but is inaccessible
On Tue, Apr 26, 2016 at 6:33 PM, Richard Smith via cfe-commits < cfe-commits@lists.llvm.org> wrote: > As noted in PR27337, this only occurs in one WTL sample, and we have no > evidence that it actually occurs in real code. Have you seen uses of this > in the wild? We generally don't want to add compatibility for MSVC bugs > unless there's some real-world motivation. > > > On Tue, Apr 26, 2016 at 2:21 AM, Dmitry Polukhin via cfe-commits < > cfe-commits@lists.llvm.org> wrote: > >> Author: dpolukhin >> Date: Tue Apr 26 04:21:17 2016 >> New Revision: 267534 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=267534&view=rev >> Log: >> [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 >> >> Added: >> cfe/trunk/test/SemaCXX/ext_ms_downcast.cpp (with props) >> Modified: >> cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td >> cfe/trunk/lib/Sema/SemaCast.cpp >> >> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=267534&r1=267533&r2=267534&view=diff >> >> ============================================================================== >> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original) >> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Tue Apr 26 >> 04:21:17 2016 >> @@ -5764,6 +5764,9 @@ def err_static_downcast_via_virtual : Er >> "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< >> >> Modified: cfe/trunk/lib/Sema/SemaCast.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaCast.cpp?rev=267534&r1=267533&r2=267534&view=diff >> >> ============================================================================== >> --- cfe/trunk/lib/Sema/SemaCast.cpp (original) >> +++ cfe/trunk/lib/Sema/SemaCast.cpp Tue Apr 26 04:21:17 2016 >> @@ -1344,10 +1344,11 @@ TryStaticDowncast(Sema &Self, CanQualTyp >> } >> >> 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 >> >> Added: cfe/trunk/test/SemaCXX/ext_ms_downcast.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/ext_ms_downcast.cpp?rev=267534&view=auto >> >> ============================================================================== >> --- cfe/trunk/test/SemaCXX/ext_ms_downcast.cpp (added) >> +++ cfe/trunk/test/SemaCXX/ext_ms_downcast.cpp Tue Apr 26 04:21:17 2016 >> @@ -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; >> >> Propchange: cfe/trunk/test/SemaCXX/ext_ms_downcast.cpp >> >> ------------------------------------------------------------------------------ >> svn:eol-style = native >> >> Propchange: cfe/trunk/test/SemaCXX/ext_ms_downcast.cpp >> >> ------------------------------------------------------------------------------ >> svn:keywords = "Author Date Id Rev URL" >> >> Propchange: cfe/trunk/test/SemaCXX/ext_ms_downcast.cpp >> >> ------------------------------------------------------------------------------ >> svn:mime-type = text/plain >> >> >> _______________________________________________ >> cfe-commits mailing list >> cfe-commits@lists.llvm.org >> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >> > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits > >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits