r267534 - [MSVC] PR27337: allow static_cast from private base to derived for WTL

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Tue Apr 26 19:12:44 PDT 2016


On Tue, Apr 26, 2016 at 7:04 PM, David Majnemer via cfe-commits <
cfe-commits at 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 at 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 at 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 at -2 {{cannot cast private base class 'A' to 'B'}}
>>> +#else
>>> +  // expected-warning at -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 at -2 {{cannot cast private base class}}
>>> +#else
>>> +    // expected-warning at -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 at -1 {{implicitly declared private here}}
>>> +// expected-note at -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 at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>>
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>
>>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160426/9c2c1ab1/attachment.html>


More information about the cfe-commits mailing list