From: David Majnemer Date: Tue, 9 Jun 2015 02:41:08 +0000 (+0000) Subject: [MSVC Compatibility] Don't diagnose c-style cast from void-ptr to fn-ptr X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9c9126a292c1723ada0b2e16883f691963567eee;p=clang [MSVC Compatibility] Don't diagnose c-style cast from void-ptr to fn-ptr The machinery added to permit a static_cast from void-ptr to fn-ptr unintentionally gets triggered for c-style casts and function-style casts. The observable effect was a diagnostic issued inappropriately. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@239382 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaCast.cpp b/lib/Sema/SemaCast.cpp index 8683d03007..d9dc4df9f2 100644 --- a/lib/Sema/SemaCast.cpp +++ b/lib/Sema/SemaCast.cpp @@ -1084,7 +1084,8 @@ static TryCastResult TryStaticCast(Sema &Self, ExprResult &SrcExpr, // Microsoft permits static_cast from 'pointer-to-void' to // 'pointer-to-function'. - if (Self.getLangOpts().MSVCCompat && DestPointee->isFunctionType()) { + if (!CStyle && Self.getLangOpts().MSVCCompat && + DestPointee->isFunctionType()) { Self.Diag(OpRange.getBegin(), diag::ext_ms_cast_fn_obj) << OpRange; Kind = CK_BitCast; return TC_Success; diff --git a/test/SemaCXX/MicrosoftCompatibility-cxx98.cpp b/test/SemaCXX/MicrosoftCompatibility-cxx98.cpp index e72878e302..bfda837e95 100644 --- a/test/SemaCXX/MicrosoftCompatibility-cxx98.cpp +++ b/test/SemaCXX/MicrosoftCompatibility-cxx98.cpp @@ -7,4 +7,8 @@ ENUM *var = 0; ENUM var2 = (ENUM)3; enum ENUM1* var3 = 0;// expected-warning {{forward references to 'enum' types are a Microsoft extension}} -void (*PR23733)() = static_cast((void *)0); // expected-warning {{static_cast between pointer-to-function and pointer-to-object is a Microsoft extension}} +typedef void (*FnPtrTy)(); +void (*PR23733_1)() = static_cast((void *)0); // expected-warning {{static_cast between pointer-to-function and pointer-to-object is a Microsoft extension}} +void (*PR23733_2)() = FnPtrTy((void *)0); +void (*PR23733_3)() = (FnPtrTy)((void *)0); +void (*PR23733_4)() = reinterpret_cast((void *)0);