Anything to improve?

From 05bc4cbc93f5f9942fc28a578dc1afa68d69daa2 Mon Sep 17 00:00:00 2001
From: Mateusz Mikula <mati...@gmail.com>
Date: Sun, 4 Jun 2017 11:33:22 +0200
Subject: [PATCH] cast ua_wcschr and ua_wcsrchr returns when WSTR_ALIGNED is
 true

Clang doesn't allow implicit conversion form "const wchar_t *" to
"PUWSTR_C" (aka wchar_t *)

Signed-off-by: Mateusz Mikula <mati...@gmail.com>
---
 mingw-w64-headers/include/stralign.h | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

diff --git a/mingw-w64-headers/include/stralign.h
b/mingw-w64-headers/include/stralign.h
index 9b5637d6..4b157c27 100644
--- a/mingw-w64-headers/include/stralign.h
+++ b/mingw-w64-headers/include/stralign.h
@@ -117,12 +117,23 @@ extern "C" {
   size_t ua_wcslen(PCUWSTR String);
 
 #ifndef __CRT__NO_INLINE
+    union {
+      wchar_t *wcharPointer;
+      const wchar_t *constWcharPointer;
+    } cast;
+   
   __CRT_INLINE PUWSTR_C ua_wcschr(PCUWSTR String,WCHAR Character) {
-    if(WSTR_ALIGNED(String)) return wcschr((PCWSTR)String,Character);
+    if(WSTR_ALIGNED(String)) {
+      cast.constWcharPointer = wcschr((PCWSTR)String,Character);
+      return cast.wcharPointer;
+    }
     return (PUWSTR_C)uaw_wcschr(String,Character);
   }
   __CRT_INLINE PUWSTR_C ua_wcsrchr(PCUWSTR String,WCHAR Character) {
-    if(WSTR_ALIGNED(String)) return wcsrchr((PCWSTR)String,Character);
+    if(WSTR_ALIGNED(String)) {
+      cast.constWcharPointer = wcsrchr((PCWSTR)String,Character);
+      return cast.wcharPointer;
+    }
     return (PUWSTR_C)uaw_wcsrchr(String,Character);
   }
 #if defined(__cplusplus) && defined(_WConst_Return)
-- 
2.12.1



------ Original Message ------
Subject: Re: [Mingw-w64-public] [PATCH] stralign: cast ua_wcschr and
ua_wcsrchr returns to wchar_t *
Date: Thu, 6 Apr 2017 11:48:24 +0200
To: Mingw-w64-public
From: Kai Tietz
> A cast via union looks like this:
> type1 *foo(const type1 *my_const_ptr)
> {
> union {
>   type1 *t1;
>   const type1 *ct1;
> } v;
> v.ct1 = my_const_ptr;
> return v.t1;
> }
>
> The advantage of such a pattern is that no type conversion
> errors/warnings are shown.  So for casting from const to none-const,
> this variant is to be preferred.  (and it works for C, and C++!!!)
>
> Cheers,
> Kai
>
> 2017-04-05 15:51 GMT+02:00 Mateusz Mikuła <mati...@gmail.com>:
>>> Hmm, using here "wchar_t *" as cast looks wrong.  Actually we should
>>> use anyway PUWSTR_C instead.
>> I noticed it a bit too late and sent another patch casting to PUWSTR_C.
>>> Nevertheless we can have here a const/none-const conversion (means
>>> const specifiers for C-runtime function isn't regarded right?).  I
>>> would suggest to introduce a union-cast instead to avoid further
>>> warnings instead.
>> Conversion from const pointer to normal pointer is definitely unsafe but
>> that's probably what GCC just did.
>> I'm unsure what you mean by "union-cast" but you can commit your fix.
>>
>>
>> ------------------------------------------------------------------------------
>> Check out the vibrant tech community on one of the world's most
>> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
>> _______________________________________________
>> Mingw-w64-public mailing list
>> Mingw-w64-public@lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/mingw-w64-public
>>
> ------------------------------------------------------------------------------
> Check out the vibrant tech community on one of the world's most
> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
> _______________________________________________
> Mingw-w64-public mailing list
> Mingw-w64-public@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

From 05bc4cbc93f5f9942fc28a578dc1afa68d69daa2 Mon Sep 17 00:00:00 2001
From: Mateusz Mikula <mati...@gmail.com>
Date: Sun, 4 Jun 2017 11:33:22 +0200
Subject: [PATCH] cast ua_wcschr and ua_wcsrchr returns when WSTR_ALIGNED is
 true

Clang doesn't allow implicit conversion form "const wchar_t *" to "PUWSTR_C" 
(aka wchar_t *)

Signed-off-by: Mateusz Mikula <mati...@gmail.com>
---
 mingw-w64-headers/include/stralign.h | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

diff --git a/mingw-w64-headers/include/stralign.h 
b/mingw-w64-headers/include/stralign.h
index 9b5637d6..4b157c27 100644
--- a/mingw-w64-headers/include/stralign.h
+++ b/mingw-w64-headers/include/stralign.h
@@ -117,12 +117,23 @@ extern "C" {
   size_t ua_wcslen(PCUWSTR String);
 
 #ifndef __CRT__NO_INLINE
+    union {
+      wchar_t *wcharPointer;
+      const wchar_t *constWcharPointer;
+    } cast;
+    
   __CRT_INLINE PUWSTR_C ua_wcschr(PCUWSTR String,WCHAR Character) {
-    if(WSTR_ALIGNED(String)) return wcschr((PCWSTR)String,Character);
+    if(WSTR_ALIGNED(String)) {
+      cast.constWcharPointer = wcschr((PCWSTR)String,Character);
+      return cast.wcharPointer;
+    }
     return (PUWSTR_C)uaw_wcschr(String,Character);
   }
   __CRT_INLINE PUWSTR_C ua_wcsrchr(PCUWSTR String,WCHAR Character) {
-    if(WSTR_ALIGNED(String)) return wcsrchr((PCWSTR)String,Character);
+    if(WSTR_ALIGNED(String)) {
+      cast.constWcharPointer = wcsrchr((PCWSTR)String,Character);
+      return cast.wcharPointer;
+    }
     return (PUWSTR_C)uaw_wcsrchr(String,Character);
   }
 #if defined(__cplusplus) && defined(_WConst_Return)
-- 
2.12.1

Attachment: signature.asc
Description: OpenPGP digital signature

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Mingw-w64-public mailing list
Mingw-w64-public@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

Reply via email to