stands.
again â vote to avoid union casts.
-Wsystem-headers) will be a default warning anytime soon. And even then it
a reason for it not to become a default warning).
A C-style cast is perfectly appropriate here, no union needed.
errors too.
Best, Norbert.
Post by Mateusz MikuÅaAnything to improve?
From 05bc4cbc93f5f9942fc28a578dc1afa68d69daa2 Mon Sep 17 00:00:00 2001
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 *)
---
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
Post by Kai Tietztype1 *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
Post by Mateusz MikuÅaPost by Kai TietzHmm, 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.
Post by Kai TietzNevertheless 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.
---------------------------------------------------------
---------------------
Post by Kai TietzPost by Mateusz MikuÅaCheck 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
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public
---------------------------------------------------------
---------------------
Post by Kai TietzCheck 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
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
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public