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 18:33:15 PDT 2016


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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160426/6af6a549/attachment-0001.html>


More information about the cfe-commits mailing list