summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorMichael Stahl <mstahl@redhat.com>2017-06-06 23:04:49 +0200
committerMichael Stahl <mstahl@redhat.com>2017-06-07 15:56:48 +0200
commit2e5e92eed940ea1992f7962b43b6bfcea0daf08b (patch)
treedb48b0a2e2bdcf5c41371df931fbcdc01068c32d /include
parent630791320d3f777557ec16558d705878c0c57b7e (diff)
tdf#108349: fix LanguageType conversions from UNO "short"
The bugdoc uses LANGUAGE_USER_LATIN_VATICAN LanguageType(0x8076). The UNO API uses signed "short" for these in various interfaces, and so the LanguageType constructor complains about out-of-(short)-range values. Avoid this by deleting the problematic constructor, so that the places that currently call it with API parameters can be changed to first cast the parameter to unsigned. (Yes, we need to write "template<>" twice in a row. Don't ask me why, i just work here. sberg says we also need to omit the explict <short>.) Change-Id: I2443a89bc8d579504fc707ded3d145f9a625597a Reviewed-on: https://gerrit.libreoffice.org/38473 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Michael Stahl <mstahl@redhat.com> (cherry picked from commit 93a41b20538f18344eb1b8c23b1eae134212b141) Reviewed-on: https://gerrit.libreoffice.org/38499 Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'include')
-rw-r--r--include/i18nlangtag/lang.h9
1 files changed, 9 insertions, 0 deletions
diff --git a/include/i18nlangtag/lang.h b/include/i18nlangtag/lang.h
index 3e37953868cc..e5d4a1f42b3f 100644
--- a/include/i18nlangtag/lang.h
+++ b/include/i18nlangtag/lang.h
@@ -95,6 +95,15 @@ struct LanguageTypeTag {};
typedef o3tl::strong_int<sal_uInt16, LanguageTypeTag> LanguageType;
inline std::ostream& operator<<(std::ostream& os, LanguageType const & lt) { os << sal_uInt16(lt); return os; }
constexpr LanguageType primary(LanguageType lt) { return LanguageType(sal_uInt16(lt) & 0x03ff); }
+
+namespace o3tl
+{
+ // delete "sal_Int16" constructor via specialization: values > 0x7FFF are
+ // actually used, and unfortunately passed around in the API as signed
+ // "short", so use this to find all places where casts must be inserted
+ template<> template<> constexpr strong_int<unsigned short,LanguageTypeTag>::strong_int(short, std::enable_if<std::is_integral<short>::value, int>::type) = delete;
+}
+
#endif
#define LANGUAGE_MASK_PRIMARY 0x03ff