Is it needed to parse system headers? In general, we implement things like this if they're needed for system headers but don't otherwise.
On Wed, Apr 27, 2016 at 6:19 AM, Dmitry Polukhin via cfe-commits < cfe-commits@lists.llvm.org> wrote: > I added example with 'B*' to 'A*' just to make sure that my patch doesn't > break it accidentally in MSVC mode. > > As for 'A*' to 'B*" case, indeed it is not very common and it looks like > someone just forgot to specify 'public'. I tried to find more real world > examples in public source codes but without Google Code Search it is hard > to do (GitHub doesn't support regexp search). Please let me know if you > think it doesn't make sense to support this "feature" in Clang and I'll > revert my patch. > > On Wed, Apr 27, 2016 at 5:12 AM, Richard Smith via cfe-commits < > cfe-commits@lists.llvm.org> wrote: > >> 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 >> >> > > _______________________________________________ > 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