From: Behdad Esfahbod Date: Fri, 20 Nov 2009 01:28:03 +0000 (-0500) Subject: Another C++ strictness fix X-Git-Tag: submit/master/20120920.151126~7^2~894 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=807b8aa486753474e05e09f4fcca8ac94021b97c;p=framework%2Fuifw%2Fharfbuzz.git Another C++ strictness fix Pango Bug 602408 - Invalid C++ code breaks compile with Sun C++ Compiler (Error: A union member cannot have a user-defined assignment operator) According to the bug: C++ Programming Language by Bjarne Stroustrup: Chapter 10.4.12 forbids explicitly using of union members with constructors, destructors or assignment operations. So we use a set() method instead of the assignment operator. Ugly, but hey, that's life. --- diff --git a/src/hb-open-type-private.hh b/src/hb-open-type-private.hh index 63b9fe7..32f6787 100644 --- a/src/hb-open-type-private.hh +++ b/src/hb-open-type-private.hh @@ -262,7 +262,7 @@ _hb_sanitize_edit (SANITIZE_ARG_DEF, #define NEUTER(Var, Val) \ (SANITIZE_OBJ (Var) && \ _hb_sanitize_edit (SANITIZE_ARG, CONST_CHARP(&(Var)), sizeof (Var)) && \ - ((Var) = (Val), true)) + ((Var).set (Val), true)) /* Template to sanitize an object. */ @@ -349,7 +349,7 @@ struct Sanitizer #define _DEFINE_INT_TYPE1_UNALIGNED(NAME, TYPE, BIG_ENDIAN, BYTES) \ struct NAME \ { \ - inline NAME& operator = (TYPE i) { (TYPE&) v = BIG_ENDIAN (i); return *this; } \ + inline NAME& set (TYPE i) { (TYPE&) v = BIG_ENDIAN (i); return *this; } \ inline operator TYPE(void) const { return BIG_ENDIAN ((TYPE&) v); } \ inline bool operator== (NAME o) const { return (TYPE&) v == (TYPE&) o.v; } \ inline bool sanitize (SANITIZE_ARG_DEF) { \ @@ -363,7 +363,7 @@ struct Sanitizer #define DEFINE_INT_TYPE1(NAME, TYPE, BIG_ENDIAN, BYTES) \ struct NAME \ { \ - inline NAME& operator = (TYPE i) { BIG_ENDIAN##_put_unaligned(v, i); return *this; } \ + inline NAME& set (TYPE i) { BIG_ENDIAN##_put_unaligned(v, i); return *this; } \ inline operator TYPE(void) const { return BIG_ENDIAN##_get_unaligned (v); } \ inline bool operator== (NAME o) const { return BIG_ENDIAN##_cmp_unaligned (v, o.v); } \ inline bool sanitize (SANITIZE_ARG_DEF) { \ @@ -388,7 +388,7 @@ DEFINE_INT_TYPE (LONG, , 32); /* 32-bit signed integer. */ struct Tag : ULONG { inline Tag (const Tag &o) { *(ULONG*)this = (ULONG&) o; } - inline Tag (uint32_t i) { *(ULONG*)this = i; } + inline Tag (uint32_t i) { (*(ULONG*)this).set (i); } inline Tag (const char *c) { *(ULONG*)this = *(ULONG*)c; } inline bool operator== (const char *c) const { return *(ULONG*)this == *(ULONG*)c; } /* What the char* converters return is NOT nul-terminated. Print using "%.4s" */ diff --git a/src/hb-ot-layout-common-private.hh b/src/hb-ot-layout-common-private.hh index fc69c89..9a0abe5 100644 --- a/src/hb-ot-layout-common-private.hh +++ b/src/hb-ot-layout-common-private.hh @@ -328,7 +328,7 @@ struct CoverageFormat1 if (HB_UNLIKELY (glyph_id > 0xFFFF)) return NOT_COVERED; GlyphID gid; - gid = glyph_id; + gid.set (glyph_id); // TODO: bsearch unsigned int num_glyphs = glyphArray.len; for (unsigned int i = 0; i < num_glyphs; i++)