]> granicus.if.org Git - clang/commitdiff
[MSVC Compatibility] Don't diagnose c-style cast from void-ptr to fn-ptr
authorDavid Majnemer <david.majnemer@gmail.com>
Tue, 9 Jun 2015 02:41:08 +0000 (02:41 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Tue, 9 Jun 2015 02:41:08 +0000 (02:41 +0000)
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

lib/Sema/SemaCast.cpp
test/SemaCXX/MicrosoftCompatibility-cxx98.cpp

index 8683d03007dd8e622e07e2eff3fe0cdd68b310d8..d9dc4df9f271a73570f78cde9d17699ceb4a027f 100644 (file)
@@ -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;
index e72878e3024019bc1bf8450ef1ede431f21e15cd..bfda837e9590b06d043e9dfc4ec716601f95576c 100644 (file)
@@ -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 (*)()>((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<FnPtrTy>((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<FnPtrTy>((void *)0);