On Tue, Apr 26, 2016 at 7:04 PM, David Majnemer via cfe-commits < cfe-commits@lists.llvm.org> wrote:
> Visual Studio 2015 (19.00.23720.0) reports: > > error C2243: 'static_cast': conversion from 'B *' to 'A *' exists, but is > inaccessible > Right, it's the other direction ('A *' to 'B *') that this patch is permitting. > 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 > >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits