diff options
author | Miklos Vajna <vmiklos@collabora.co.uk> | 2017-03-09 09:23:34 +0100 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.co.uk> | 2017-03-09 09:38:15 +0000 |
commit | c60bdb06f580e0be6c5c4eb1977d98115d0b03b9 (patch) | |
tree | b4c56f0bf07312f2525f3009f71fabc7382009fe /external | |
parent | 4ff09c76a3bf46001fd0b896c614d47f51ce52ae (diff) |
pdfium: clean up no longer needed VS2013 patch
Change-Id: I09c72d795aa6667e81326008fa66409c1e6ec175
Reviewed-on: https://gerrit.libreoffice.org/34988
Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk>
Tested-by: Jenkins <ci@libreoffice.org>
Diffstat (limited to 'external')
-rw-r--r-- | external/pdfium/UnpackedTarball_pdfium.mk | 2 | ||||
-rw-r--r-- | external/pdfium/msvc.patch.1 | 1344 |
2 files changed, 0 insertions, 1346 deletions
diff --git a/external/pdfium/UnpackedTarball_pdfium.mk b/external/pdfium/UnpackedTarball_pdfium.mk index 17ddd9bd1029..732e6b26f829 100644 --- a/external/pdfium/UnpackedTarball_pdfium.mk +++ b/external/pdfium/UnpackedTarball_pdfium.mk @@ -9,8 +9,6 @@ pdfium_patches := pdfium_patches += visibility.patch.1 -# To support MSVC 2013, upstream already moved to 2015. -pdfium_patches += msvc.patch.1 # To support macOS 10.9 baseline. pdfium_patches += macos.patch.1 pdfium_patches += ubsan.patch diff --git a/external/pdfium/msvc.patch.1 b/external/pdfium/msvc.patch.1 deleted file mode 100644 index 890e94ff985b..000000000000 --- a/external/pdfium/msvc.patch.1 +++ /dev/null @@ -1,1344 +0,0 @@ -diff --git a/core/fpdfapi/font/ttgsubtable.cpp b/core/fpdfapi/font/ttgsubtable.cpp -index 51e8e9c..4f4f696 100644 ---- a/core/fpdfapi/font/ttgsubtable.cpp -+++ b/core/fpdfapi/font/ttgsubtable.cpp -@@ -94,29 +94,33 @@ bool CFX_CTTGSUBTable::GetVerticalGlyph(uint32_t glyphnum, - (uint8_t)'t', - }; - if (!m_bFeautureMapLoad) { -- for (const auto& script : ScriptList.ScriptRecords) { -- for (const auto& record : script.Script.LangSysRecords) { -- for (const auto& index : record.LangSys.FeatureIndices) { -- if (FeatureList.FeatureRecords[index].FeatureTag == tag[0] || -- FeatureList.FeatureRecords[index].FeatureTag == tag[1]) { -- m_featureSet.insert(index); -+ for (int i = 0; i < ScriptList.ScriptCount; i++) { -+ for (int j = 0; j < ScriptList.ScriptRecord[i].Script.LangSysCount; ++j) { -+ const auto& record = ScriptList.ScriptRecord[i].Script.LangSysRecord[j]; -+ for (int k = 0; k < record.LangSys.FeatureCount; ++k) { -+ uint32_t index = record.LangSys.FeatureIndex[k]; -+ if (FeatureList.FeatureRecord[index].FeatureTag == tag[0] || -+ FeatureList.FeatureRecord[index].FeatureTag == tag[1]) { -+ if (!pdfium::ContainsKey(m_featureMap, index)) { -+ m_featureMap[index] = index; -+ } - } - } - } - } -- if (m_featureSet.empty()) { -- int i = 0; -- for (const auto& feature : FeatureList.FeatureRecords) { -- if (feature.FeatureTag == tag[0] || feature.FeatureTag == tag[1]) -- m_featureSet.insert(i); -- ++i; -+ if (m_featureMap.empty()) { -+ for (int i = 0; i < FeatureList.FeatureCount; i++) { -+ if (FeatureList.FeatureRecord[i].FeatureTag == tag[0] || -+ FeatureList.FeatureRecord[i].FeatureTag == tag[1]) { -+ m_featureMap[i] = i; -+ } - } - } - m_bFeautureMapLoad = true; - } -- for (const auto& item : m_featureSet) { -+ for (const auto& pair : m_featureMap) { - if (GetVerticalGlyphSub(glyphnum, vglyphnum, -- &FeatureList.FeatureRecords[item].Feature)) { -+ &FeatureList.FeatureRecord[pair.second].Feature)) { - return true; - } - } -@@ -126,13 +130,16 @@ bool CFX_CTTGSUBTable::GetVerticalGlyph(uint32_t glyphnum, - bool CFX_CTTGSUBTable::GetVerticalGlyphSub(uint32_t glyphnum, - uint32_t* vglyphnum, - TFeature* Feature) { -- for (int index : Feature->LookupListIndices) { -- if (index < 0 || index >= pdfium::CollectionSize<int>(LookupList.Lookups)) -+ for (int i = 0; i < Feature->LookupCount; i++) { -+ int index = Feature->LookupListIndex[i]; -+ if (index < 0 || LookupList.LookupCount < index) { - continue; -- -- if (LookupList.Lookups[index].LookupType == 1 && -- GetVerticalGlyphSub2(glyphnum, vglyphnum, &LookupList.Lookups[index])) { -- return true; -+ } -+ if (LookupList.Lookup[index].LookupType == 1) { -+ if (GetVerticalGlyphSub2(glyphnum, vglyphnum, -+ &LookupList.Lookup[index])) { -+ return true; -+ } - } - } - return false; -@@ -141,10 +148,10 @@ bool CFX_CTTGSUBTable::GetVerticalGlyphSub(uint32_t glyphnum, - bool CFX_CTTGSUBTable::GetVerticalGlyphSub2(uint32_t glyphnum, - uint32_t* vglyphnum, - TLookup* Lookup) { -- for (const auto& subTable : Lookup->SubTables) { -- switch (subTable->SubstFormat) { -+ for (int i = 0; i < Lookup->SubTableCount; i++) { -+ switch (Lookup->SubTable[i]->SubstFormat) { - case 1: { -- auto tbl1 = static_cast<TSingleSubstFormat1*>(subTable.get()); -+ TSingleSubstFormat1* tbl1 = (TSingleSubstFormat1*)Lookup->SubTable[i]; - if (GetCoverageIndex(tbl1->Coverage.get(), glyphnum) >= 0) { - *vglyphnum = glyphnum + tbl1->DeltaGlyphID; - return true; -@@ -152,11 +159,11 @@ bool CFX_CTTGSUBTable::GetVerticalGlyphSub2(uint32_t glyphnum, - break; - } - case 2: { -- auto tbl2 = static_cast<TSingleSubstFormat2*>(subTable.get()); -- int index = GetCoverageIndex(tbl2->Coverage.get(), glyphnum); -- if (index >= 0 && -- index < pdfium::CollectionSize<int>(tbl2->Substitutes)) { -- *vglyphnum = tbl2->Substitutes[index]; -+ TSingleSubstFormat2* tbl2 = (TSingleSubstFormat2*)Lookup->SubTable[i]; -+ int index = -1; -+ index = GetCoverageIndex(tbl2->Coverage.get(), glyphnum); -+ if (0 <= index && index < tbl2->GlyphCount) { -+ *vglyphnum = tbl2->Substitute[index]; - return true; - } - break; -@@ -168,28 +175,29 @@ bool CFX_CTTGSUBTable::GetVerticalGlyphSub2(uint32_t glyphnum, - - int CFX_CTTGSUBTable::GetCoverageIndex(TCoverageFormatBase* Coverage, - uint32_t g) const { -- if (!Coverage) -+ int i = 0; -+ if (!Coverage) { - return -1; -- -+ } - switch (Coverage->CoverageFormat) { - case 1: { -- int i = 0; - TCoverageFormat1* c1 = (TCoverageFormat1*)Coverage; -- for (const auto& glyph : c1->GlyphArray) { -- if (static_cast<uint32_t>(glyph) == g) -+ for (i = 0; i < c1->GlyphCount; i++) { -+ if ((uint32_t)c1->GlyphArray[i] == g) { - return i; -- ++i; -+ } - } - return -1; - } - case 2: { - TCoverageFormat2* c2 = (TCoverageFormat2*)Coverage; -- for (const auto& rangeRec : c2->RangeRecords) { -- uint32_t s = rangeRec.Start; -- uint32_t e = rangeRec.End; -- uint32_t si = rangeRec.StartCoverageIndex; -- if (s <= g && g <= e) -+ for (i = 0; i < c2->RangeCount; i++) { -+ uint32_t s = c2->RangeRecord[i].Start; -+ uint32_t e = c2->RangeRecord[i].End; -+ uint32_t si = c2->RangeRecord[i].StartCoverageIndex; -+ if (s <= g && g <= e) { - return si + g - s; -+ } - } - return -1; - } -@@ -237,21 +245,33 @@ bool CFX_CTTGSUBTable::Parse(FT_Bytes scriptlist, - } - - void CFX_CTTGSUBTable::ParseScriptList(FT_Bytes raw, TScriptList* rec) { -+ int i; - FT_Bytes sp = raw; -- rec->ScriptRecords = std::vector<TScriptRecord>(GetUInt16(sp)); -- for (auto& scriptRec : rec->ScriptRecords) { -- scriptRec.ScriptTag = GetUInt32(sp); -- ParseScript(&raw[GetUInt16(sp)], &scriptRec.Script); -+ rec->ScriptCount = GetUInt16(sp); -+ if (rec->ScriptCount <= 0) { -+ return; -+ } -+ rec->ScriptRecord.reset(new TScriptRecord[rec->ScriptCount]); -+ for (i = 0; i < rec->ScriptCount; i++) { -+ rec->ScriptRecord[i].ScriptTag = GetUInt32(sp); -+ uint16_t offset = GetUInt16(sp); -+ ParseScript(&raw[offset], &rec->ScriptRecord[i].Script); - } - } - - void CFX_CTTGSUBTable::ParseScript(FT_Bytes raw, TScript* rec) { -+ int i; - FT_Bytes sp = raw; - rec->DefaultLangSys = GetUInt16(sp); -- rec->LangSysRecords = std::vector<TLangSysRecord>(GetUInt16(sp)); -- for (auto& sysRecord : rec->LangSysRecords) { -- sysRecord.LangSysTag = GetUInt32(sp); -- ParseLangSys(&raw[GetUInt16(sp)], &sysRecord.LangSys); -+ rec->LangSysCount = GetUInt16(sp); -+ if (rec->LangSysCount <= 0) { -+ return; -+ } -+ rec->LangSysRecord.reset(new TLangSysRecord[rec->LangSysCount]); -+ for (i = 0; i < rec->LangSysCount; i++) { -+ rec->LangSysRecord[i].LangSysTag = GetUInt32(sp); -+ uint16_t offset = GetUInt16(sp); -+ ParseLangSys(&raw[offset], &rec->LangSysRecord[i].LangSys); - } - } - -@@ -259,45 +279,81 @@ void CFX_CTTGSUBTable::ParseLangSys(FT_Bytes raw, TLangSys* rec) { - FT_Bytes sp = raw; - rec->LookupOrder = GetUInt16(sp); - rec->ReqFeatureIndex = GetUInt16(sp); -- rec->FeatureIndices = std::vector<uint16_t>(GetUInt16(sp)); -- for (auto& element : rec->FeatureIndices) -- element = GetUInt16(sp); -+ rec->FeatureCount = GetUInt16(sp); -+ if (rec->FeatureCount <= 0) { -+ return; -+ } -+ rec->FeatureIndex.reset(new uint16_t[rec->FeatureCount]); -+ FXSYS_memset(rec->FeatureIndex.get(), 0, -+ sizeof(uint16_t) * rec->FeatureCount); -+ for (int i = 0; i < rec->FeatureCount; ++i) { -+ rec->FeatureIndex[i] = GetUInt16(sp); -+ } - } - - void CFX_CTTGSUBTable::ParseFeatureList(FT_Bytes raw, TFeatureList* rec) { -+ int i; - FT_Bytes sp = raw; -- rec->FeatureRecords = std::vector<TFeatureRecord>(GetUInt16(sp)); -- for (auto& featureRec : rec->FeatureRecords) { -- featureRec.FeatureTag = GetUInt32(sp); -- ParseFeature(&raw[GetUInt16(sp)], &featureRec.Feature); -+ rec->FeatureCount = GetUInt16(sp); -+ if (rec->FeatureCount <= 0) { -+ return; -+ } -+ rec->FeatureRecord.reset(new TFeatureRecord[rec->FeatureCount]); -+ for (i = 0; i < rec->FeatureCount; i++) { -+ rec->FeatureRecord[i].FeatureTag = GetUInt32(sp); -+ uint16_t offset = GetUInt16(sp); -+ ParseFeature(&raw[offset], &rec->FeatureRecord[i].Feature); - } - } - - void CFX_CTTGSUBTable::ParseFeature(FT_Bytes raw, TFeature* rec) { -+ int i; - FT_Bytes sp = raw; - rec->FeatureParams = GetUInt16(sp); -- rec->LookupListIndices = std::vector<uint16_t>(GetUInt16(sp)); -- for (auto& listIndex : rec->LookupListIndices) -- listIndex = GetUInt16(sp); -+ rec->LookupCount = GetUInt16(sp); -+ if (rec->LookupCount <= 0) { -+ return; -+ } -+ rec->LookupListIndex.reset(new uint16_t[rec->LookupCount]); -+ for (i = 0; i < rec->LookupCount; i++) { -+ rec->LookupListIndex[i] = GetUInt16(sp); -+ } - } - - void CFX_CTTGSUBTable::ParseLookupList(FT_Bytes raw, TLookupList* rec) { -+ int i; - FT_Bytes sp = raw; -- rec->Lookups = std::vector<TLookup>(GetUInt16(sp)); -- for (auto& lookup : rec->Lookups) -- ParseLookup(&raw[GetUInt16(sp)], &lookup); -+ rec->LookupCount = GetUInt16(sp); -+ if (rec->LookupCount <= 0) { -+ return; -+ } -+ rec->Lookup.reset(new TLookup[rec->LookupCount]); -+ for (i = 0; i < rec->LookupCount; i++) { -+ uint16_t offset = GetUInt16(sp); -+ ParseLookup(&raw[offset], &rec->Lookup[i]); -+ } - } - - void CFX_CTTGSUBTable::ParseLookup(FT_Bytes raw, TLookup* rec) { -+ int i; - FT_Bytes sp = raw; - rec->LookupType = GetUInt16(sp); - rec->LookupFlag = GetUInt16(sp); -- rec->SubTables = std::vector<std::unique_ptr<TSubTableBase>>(GetUInt16(sp)); -- if (rec->LookupType != 1) -+ rec->SubTableCount = GetUInt16(sp); -+ if (rec->SubTableCount <= 0) { - return; -- -- for (auto& subTable : rec->SubTables) -- ParseSingleSubst(&raw[GetUInt16(sp)], &subTable); -+ } -+ rec->SubTable.reset(new TSubTableBase*[rec->SubTableCount]); -+ for (i = 0; i < rec->SubTableCount; i++) { -+ rec->SubTable[i] = nullptr; -+ } -+ if (rec->LookupType != 1) { -+ return; -+ } -+ for (i = 0; i < rec->SubTableCount; i++) { -+ uint16_t offset = GetUInt16(sp); -+ ParseSingleSubst(&raw[offset], &rec->SubTable[i]); -+ } - } - - CFX_CTTGSUBTable::TCoverageFormatBase* CFX_CTTGSUBTable::ParseCoverage( -@@ -317,39 +373,47 @@ CFX_CTTGSUBTable::TCoverageFormatBase* CFX_CTTGSUBTable::ParseCoverage( - - void CFX_CTTGSUBTable::ParseCoverageFormat1(FT_Bytes raw, - TCoverageFormat1* rec) { -+ int i; - FT_Bytes sp = raw; -- (void)GetUInt16(sp); -- rec->GlyphArray = std::vector<uint16_t>(GetUInt16(sp)); -- for (auto& glyph : rec->GlyphArray) -- glyph = GetUInt16(sp); -+ GetUInt16(sp); -+ rec->GlyphCount = GetUInt16(sp); -+ if (rec->GlyphCount <= 0) { -+ return; -+ } -+ rec->GlyphArray.reset(new uint16_t[rec->GlyphCount]); -+ for (i = 0; i < rec->GlyphCount; i++) { -+ rec->GlyphArray[i] = GetUInt16(sp); -+ } - } - - void CFX_CTTGSUBTable::ParseCoverageFormat2(FT_Bytes raw, - TCoverageFormat2* rec) { -+ int i; - FT_Bytes sp = raw; -- (void)GetUInt16(sp); -- rec->RangeRecords = std::vector<TRangeRecord>(GetUInt16(sp)); -- for (auto& rangeRec : rec->RangeRecords) { -- rangeRec.Start = GetUInt16(sp); -- rangeRec.End = GetUInt16(sp); -- rangeRec.StartCoverageIndex = GetUInt16(sp); -+ GetUInt16(sp); -+ rec->RangeCount = GetUInt16(sp); -+ if (rec->RangeCount <= 0) { -+ return; -+ } -+ rec->RangeRecord.reset(new TRangeRecord[rec->RangeCount]); -+ for (i = 0; i < rec->RangeCount; i++) { -+ rec->RangeRecord[i].Start = GetUInt16(sp); -+ rec->RangeRecord[i].End = GetUInt16(sp); -+ rec->RangeRecord[i].StartCoverageIndex = GetUInt16(sp); - } - } - --void CFX_CTTGSUBTable::ParseSingleSubst(FT_Bytes raw, -- std::unique_ptr<TSubTableBase>* rec) { -+void CFX_CTTGSUBTable::ParseSingleSubst(FT_Bytes raw, TSubTableBase** rec) { - FT_Bytes sp = raw; - uint16_t Format = GetUInt16(sp); - switch (Format) { - case 1: -- *rec = pdfium::MakeUnique<TSingleSubstFormat1>(); -- ParseSingleSubstFormat1(raw, -- static_cast<TSingleSubstFormat1*>(rec->get())); -+ *rec = new TSingleSubstFormat1(); -+ ParseSingleSubstFormat1(raw, (TSingleSubstFormat1*)*rec); - break; - case 2: -- *rec = pdfium::MakeUnique<TSingleSubstFormat2>(); -- ParseSingleSubstFormat2(raw, -- static_cast<TSingleSubstFormat2*>(rec->get())); -+ *rec = new TSingleSubstFormat2(); -+ ParseSingleSubstFormat2(raw, (TSingleSubstFormat2*)*rec); - break; - } - } -@@ -365,17 +429,23 @@ void CFX_CTTGSUBTable::ParseSingleSubstFormat1(FT_Bytes raw, - - void CFX_CTTGSUBTable::ParseSingleSubstFormat2(FT_Bytes raw, - TSingleSubstFormat2* rec) { -+ int i; - FT_Bytes sp = raw; -- (void)GetUInt16(sp); -+ GetUInt16(sp); - uint16_t offset = GetUInt16(sp); - rec->Coverage.reset(ParseCoverage(&raw[offset])); -- rec->Substitutes = std::vector<uint16_t>(GetUInt16(sp)); -- for (auto& substitute : rec->Substitutes) -- substitute = GetUInt16(sp); -+ rec->GlyphCount = GetUInt16(sp); -+ if (rec->GlyphCount <= 0) { -+ return; -+ } -+ rec->Substitute.reset(new uint16_t[rec->GlyphCount]); -+ for (i = 0; i < rec->GlyphCount; i++) { -+ rec->Substitute[i] = GetUInt16(sp); -+ } - } - - CFX_CTTGSUBTable::TCoverageFormat1::TCoverageFormat1() -- : TCoverageFormatBase(1) {} -+ : TCoverageFormatBase(1), GlyphCount(0) {} - - CFX_CTTGSUBTable::TCoverageFormat1::~TCoverageFormat1() {} - -@@ -383,7 +453,7 @@ CFX_CTTGSUBTable::TRangeRecord::TRangeRecord() - : Start(0), End(0), StartCoverageIndex(0) {} - - CFX_CTTGSUBTable::TCoverageFormat2::TCoverageFormat2() -- : TCoverageFormatBase(2) {} -+ : TCoverageFormatBase(2), RangeCount(0) {} - - CFX_CTTGSUBTable::TCoverageFormat2::~TCoverageFormat2() {} - -@@ -393,34 +463,41 @@ CFX_CTTGSUBTable::TSingleSubstFormat1::TSingleSubstFormat1() - CFX_CTTGSUBTable::TSingleSubstFormat1::~TSingleSubstFormat1() {} - - CFX_CTTGSUBTable::TSingleSubstFormat2::TSingleSubstFormat2() -- : TSubTableBase(2) {} -+ : TSubTableBase(2), GlyphCount(0) {} - - CFX_CTTGSUBTable::TSingleSubstFormat2::~TSingleSubstFormat2() {} - --CFX_CTTGSUBTable::TLookup::TLookup() : LookupType(0), LookupFlag(0) {} -+CFX_CTTGSUBTable::TLookup::TLookup() -+ : LookupType(0), LookupFlag(0), SubTableCount(0) {} - --CFX_CTTGSUBTable::TLookup::~TLookup() {} -+CFX_CTTGSUBTable::TLookup::~TLookup() { -+ if (SubTable) { -+ for (int i = 0; i < SubTableCount; ++i) -+ delete SubTable[i]; -+ } -+} - --CFX_CTTGSUBTable::TScript::TScript() : DefaultLangSys(0) {} -+CFX_CTTGSUBTable::TScript::TScript() : DefaultLangSys(0), LangSysCount(0) {} - - CFX_CTTGSUBTable::TScript::~TScript() {} - --CFX_CTTGSUBTable::TScriptList::TScriptList() {} -+CFX_CTTGSUBTable::TScriptList::TScriptList() : ScriptCount(0) {} - - CFX_CTTGSUBTable::TScriptList::~TScriptList() {} - --CFX_CTTGSUBTable::TFeature::TFeature() : FeatureParams(0) {} -+CFX_CTTGSUBTable::TFeature::TFeature() : FeatureParams(0), LookupCount(0) {} - - CFX_CTTGSUBTable::TFeature::~TFeature() {} - --CFX_CTTGSUBTable::TFeatureList::TFeatureList() {} -+CFX_CTTGSUBTable::TFeatureList::TFeatureList() : FeatureCount(0) {} - - CFX_CTTGSUBTable::TFeatureList::~TFeatureList() {} - --CFX_CTTGSUBTable::TLookupList::TLookupList() {} -+CFX_CTTGSUBTable::TLookupList::TLookupList() : LookupCount(0) {} - - CFX_CTTGSUBTable::TLookupList::~TLookupList() {} - --CFX_CTTGSUBTable::TLangSys::TLangSys() : LookupOrder(0), ReqFeatureIndex(0) {} -+CFX_CTTGSUBTable::TLangSys::TLangSys() -+ : LookupOrder(0), ReqFeatureIndex(0), FeatureCount(0) {} - - CFX_CTTGSUBTable::TLangSys::~TLangSys() {} -diff --git a/core/fpdfapi/font/ttgsubtable.h b/core/fpdfapi/font/ttgsubtable.h -index f927269..59ee4ca 100644 ---- a/core/fpdfapi/font/ttgsubtable.h -+++ b/core/fpdfapi/font/ttgsubtable.h -@@ -9,9 +9,8 @@ - - #include <stdint.h> - -+#include <map> - #include <memory> --#include <set> --#include <vector> - - #include "core/fxcrt/fx_basic.h" - #include "core/fxge/fx_font.h" -@@ -53,7 +52,8 @@ class CFX_CTTGSUBTable { - - uint16_t LookupOrder; - uint16_t ReqFeatureIndex; -- std::vector<uint16_t> FeatureIndices; -+ uint16_t FeatureCount; -+ std::unique_ptr<uint16_t[]> FeatureIndex; - - private: - TLangSys(const TLangSys&) = delete; -@@ -76,7 +76,8 @@ class CFX_CTTGSUBTable { - ~TScript(); - - uint16_t DefaultLangSys; -- std::vector<TLangSysRecord> LangSysRecords; -+ uint16_t LangSysCount; -+ std::unique_ptr<TLangSysRecord[]> LangSysRecord; - - private: - TScript(const TScript&) = delete; -@@ -98,7 +99,8 @@ class CFX_CTTGSUBTable { - TScriptList(); - ~TScriptList(); - -- std::vector<TScriptRecord> ScriptRecords; -+ uint16_t ScriptCount; -+ std::unique_ptr<TScriptRecord[]> ScriptRecord; - - private: - TScriptList(const TScriptList&) = delete; -@@ -110,13 +112,13 @@ class CFX_CTTGSUBTable { - ~TFeature(); - - uint16_t FeatureParams; -- std::vector<uint16_t> LookupListIndices; -+ int LookupCount; -+ std::unique_ptr<uint16_t[]> LookupListIndex; - - private: - TFeature(const TFeature&) = delete; - TFeature& operator=(const TFeature&) = delete; - }; -- - struct TFeatureRecord { - TFeatureRecord() : FeatureTag(0) {} - -@@ -132,7 +134,8 @@ class CFX_CTTGSUBTable { - TFeatureList(); - ~TFeatureList(); - -- std::vector<TFeatureRecord> FeatureRecords; -+ int FeatureCount; -+ std::unique_ptr<TFeatureRecord[]> FeatureRecord; - - private: - TFeatureList(const TFeatureList&) = delete; -@@ -165,7 +168,8 @@ class CFX_CTTGSUBTable { - TCoverageFormat1(); - ~TCoverageFormat1() override; - -- std::vector<uint16_t> GlyphArray; -+ uint16_t GlyphCount; -+ std::unique_ptr<uint16_t[]> GlyphArray; - - private: - TCoverageFormat1(const TCoverageFormat1&) = delete; -@@ -191,7 +195,8 @@ class CFX_CTTGSUBTable { - TCoverageFormat2(); - ~TCoverageFormat2() override; - -- std::vector<TRangeRecord> RangeRecords; -+ uint16_t RangeCount; -+ std::unique_ptr<TRangeRecord[]> RangeRecord; - - private: - TCoverageFormat2(const TCoverageFormat2&) = delete; -@@ -239,7 +244,8 @@ class CFX_CTTGSUBTable { - ~TSingleSubstFormat2() override; - - std::unique_ptr<TCoverageFormatBase> Coverage; -- std::vector<uint16_t> Substitutes; -+ uint16_t GlyphCount; -+ std::unique_ptr<uint16_t[]> Substitute; - - private: - TSingleSubstFormat2(const TSingleSubstFormat2&) = delete; -@@ -252,7 +258,8 @@ class CFX_CTTGSUBTable { - - uint16_t LookupType; - uint16_t LookupFlag; -- std::vector<std::unique_ptr<TSubTableBase>> SubTables; -+ uint16_t SubTableCount; -+ std::unique_ptr<TSubTableBase* []> SubTable; - - private: - TLookup(const TLookup&) = delete; -@@ -263,7 +270,8 @@ class CFX_CTTGSUBTable { - TLookupList(); - ~TLookupList(); - -- std::vector<TLookup> Lookups; -+ int LookupCount; -+ std::unique_ptr<TLookup[]> Lookup; - - private: - TLookupList(const TLookupList&) = delete; -@@ -281,7 +289,7 @@ class CFX_CTTGSUBTable { - TCoverageFormatBase* ParseCoverage(FT_Bytes raw); - void ParseCoverageFormat1(FT_Bytes raw, TCoverageFormat1* rec); - void ParseCoverageFormat2(FT_Bytes raw, TCoverageFormat2* rec); -- void ParseSingleSubst(FT_Bytes raw, std::unique_ptr<TSubTableBase>* rec); -+ void ParseSingleSubst(FT_Bytes raw, TSubTableBase** rec); - void ParseSingleSubstFormat1(FT_Bytes raw, TSingleSubstFormat1* rec); - void ParseSingleSubstFormat2(FT_Bytes raw, TSingleSubstFormat2* rec); - -@@ -299,7 +307,7 @@ class CFX_CTTGSUBTable { - int32_t GetInt32(FT_Bytes& p) const; - uint32_t GetUInt32(FT_Bytes& p) const; - -- std::set<uint32_t> m_featureSet; -+ std::map<uint32_t, uint32_t> m_featureMap; - bool m_bFeautureMapLoad; - bool loaded; - tt_gsub_header header; -diff --git a/core/fpdfapi/page/cpdf_contentmarkitem.h b/core/fpdfapi/page/cpdf_contentmarkitem.h -index ed27371..2d08a8e 100644 ---- a/core/fpdfapi/page/cpdf_contentmarkitem.h -+++ b/core/fpdfapi/page/cpdf_contentmarkitem.h -@@ -23,8 +23,6 @@ class CPDF_ContentMarkItem { - CPDF_ContentMarkItem(const CPDF_ContentMarkItem& that); - ~CPDF_ContentMarkItem(); - -- CPDF_ContentMarkItem& operator=(CPDF_ContentMarkItem&& other) = default; -- - CFX_ByteString GetName() const { return m_MarkName; } - ParamType GetParamType() const { return m_ParamType; } - CPDF_Dictionary* GetParam() const; -diff --git a/core/fpdfapi/page/cpdf_psengine.h b/core/fpdfapi/page/cpdf_psengine.h -index 659ca82..0c94959 100644 ---- a/core/fpdfapi/page/cpdf_psengine.h -+++ b/core/fpdfapi/page/cpdf_psengine.h -@@ -63,7 +63,7 @@ enum PDF_PSOP { - PSOP_CONST - }; - --constexpr uint32_t PSENGINE_STACKSIZE = 100; -+const uint32_t PSENGINE_STACKSIZE = 100; - - class CPDF_PSProc { - public: -diff --git a/core/fxge/ge/cfx_facecache.cpp b/core/fxge/ge/cfx_facecache.cpp -index cbaa07e..95338c2 100644 ---- a/core/fxge/ge/cfx_facecache.cpp -+++ b/core/fxge/ge/cfx_facecache.cpp -@@ -25,7 +25,7 @@ - - namespace { - --constexpr uint32_t kInvalidGlyphIndex = static_cast<uint32_t>(-1); -+const uint32_t kInvalidGlyphIndex = static_cast<uint32_t>(-1); - - void GammaAdjust(uint8_t* pData, - int nHeight, -diff --git a/third_party/base/numerics/safe_conversions.h b/third_party/base/numerics/safe_conversions.h -index dc61d9c..ae25d70 100644 ---- a/third_party/base/numerics/safe_conversions.h -+++ b/third_party/base/numerics/safe_conversions.h -@@ -51,7 +51,7 @@ namespace base { - // Convenience function that returns true if the supplied value is in range - // for the destination type. - template <typename Dst, typename Src> --constexpr bool IsValueInRangeForNumericType(Src value) { -+bool IsValueInRangeForNumericType(Src value) { - return internal::DstRangeRelationToSrcRange<Dst>(value).IsValid(); - } - -@@ -72,7 +72,7 @@ struct CheckOnFailure { - // except that it CHECKs that the specified numeric conversion will not - // overflow or underflow. NaN source will always trigger a CHECK. - template <typename Dst, class CheckHandler = CheckOnFailure, typename Src> --constexpr Dst checked_cast(Src value) { -+Dst checked_cast(Src value) { - // This throws a compile-time error on evaluating the constexpr if it can be - // determined at compile-time as failing, otherwise it will CHECK at runtime. - using SrcType = typename internal::UnderlyingType<Src>::type; -@@ -84,19 +84,19 @@ constexpr Dst checked_cast(Src value) { - // Default boundaries for integral/float: max/infinity, lowest/-infinity, 0/NaN. - template <typename T> - struct SaturationDefaultHandler { -- static constexpr T NaN() { -+ static T NaN() { - return std::numeric_limits<T>::has_quiet_NaN - ? std::numeric_limits<T>::quiet_NaN() - : T(); - } -- static constexpr T max() { return std::numeric_limits<T>::max(); } -- static constexpr T Overflow() { -+ static T max() { return std::numeric_limits<T>::max(); } -+ static T Overflow() { - return std::numeric_limits<T>::has_infinity - ? std::numeric_limits<T>::infinity() - : std::numeric_limits<T>::max(); - } -- static constexpr T lowest() { return std::numeric_limits<T>::lowest(); } -- static constexpr T Underflow() { -+ static T lowest() { return std::numeric_limits<T>::lowest(); } -+ static T Underflow() { - return std::numeric_limits<T>::has_infinity - ? std::numeric_limits<T>::infinity() * -1 - : std::numeric_limits<T>::lowest(); -@@ -106,7 +106,7 @@ struct SaturationDefaultHandler { - namespace internal { - - template <typename Dst, template <typename> class S, typename Src> --constexpr Dst saturated_cast_impl(Src value, RangeCheck constraint) { -+Dst saturated_cast_impl(Src value, RangeCheck constraint) { - // For some reason clang generates much better code when the branch is - // structured exactly this way, rather than a sequence of checks. - return !constraint.IsOverflowFlagSet() -@@ -126,7 +126,7 @@ template <typename Dst, - template <typename> - class SaturationHandler = SaturationDefaultHandler, - typename Src> --constexpr Dst saturated_cast(Src value) { -+Dst saturated_cast(Src value) { - using SrcType = typename UnderlyingType<Src>::type; - return saturated_cast_impl<Dst, SaturationHandler, SrcType>( - value, -@@ -137,7 +137,7 @@ constexpr Dst saturated_cast(Src value) { - // it will cause a compile failure if the destination type is not large enough - // to contain any value in the source type. It performs no runtime checking. - template <typename Dst, typename Src> --constexpr Dst strict_cast(Src value) { -+Dst strict_cast(Src value) { - using SrcType = typename UnderlyingType<Src>::type; - static_assert(UnderlyingType<Src>::is_numeric, "Argument must be numeric."); - static_assert(std::is_arithmetic<Dst>::value, "Result must be numeric."); -@@ -187,17 +187,17 @@ class StrictNumeric { - public: - using type = T; - -- constexpr StrictNumeric() : value_(0) {} -+ StrictNumeric() : value_(0) {} - - // Copy constructor. - template <typename Src> -- constexpr StrictNumeric(const StrictNumeric<Src>& rhs) -+ StrictNumeric(const StrictNumeric<Src>& rhs) - : value_(strict_cast<T>(rhs.value_)) {} - - // This is not an explicit constructor because we implicitly upgrade regular - // numerics to StrictNumerics to make them easier to use. - template <typename Src> -- constexpr StrictNumeric(Src value) // NOLINT(runtime/explicit) -+ StrictNumeric(Src value) // NOLINT(runtime/explicit) - : value_(strict_cast<T>(value)) {} - - // If you got here from a compiler error, it's because you tried to assign -@@ -215,7 +215,7 @@ class StrictNumeric { - template <typename Dst, - typename std::enable_if< - IsNumericRangeContained<Dst, T>::value>::type* = nullptr> -- constexpr operator Dst() const { -+ operator Dst() const { - return static_cast<typename ArithmeticOrUnderlyingEnum<Dst>::type>(value_); - } - -@@ -225,7 +225,7 @@ class StrictNumeric { - - // Convience wrapper returns a StrictNumeric from the provided arithmetic type. - template <typename T> --constexpr StrictNumeric<typename UnderlyingType<T>::type> MakeStrictNum( -+StrictNumeric<typename UnderlyingType<T>::type> MakeStrictNum( - const T value) { - return value; - } -@@ -241,7 +241,7 @@ std::ostream& operator<<(std::ostream& os, const StrictNumeric<T>& value) { - template <typename L, typename R, \ - typename std::enable_if< \ - internal::IsStrictOp<L, R>::value>::type* = nullptr> \ -- constexpr bool operator OP(const L lhs, const R rhs) { \ -+ bool operator OP(const L lhs, const R rhs) { \ - return SafeCompare<NAME, typename UnderlyingType<L>::type, \ - typename UnderlyingType<R>::type>(lhs, rhs); \ - } -diff --git a/third_party/base/numerics/safe_conversions_impl.h b/third_party/base/numerics/safe_conversions_impl.h -index 2a7ce14..4a1b386 100644 ---- a/third_party/base/numerics/safe_conversions_impl.h -+++ b/third_party/base/numerics/safe_conversions_impl.h -@@ -42,14 +42,14 @@ struct PositionOfSignBit { - // warnings on: unsigned(value) < 0. - template <typename T, - typename std::enable_if<std::is_signed<T>::value>::type* = nullptr> --constexpr bool IsValueNegative(T value) { -+bool IsValueNegative(T value) { - static_assert(std::is_arithmetic<T>::value, "Argument must be numeric."); - return value < 0; - } - - template <typename T, - typename std::enable_if<!std::is_signed<T>::value>::type* = nullptr> --constexpr bool IsValueNegative(T) { -+bool IsValueNegative(T) { - static_assert(std::is_arithmetic<T>::value, "Argument must be numeric."); - return false; - } -@@ -58,7 +58,7 @@ constexpr bool IsValueNegative(T) { - // arguments, but probably doesn't do what you want for any unsigned value - // larger than max / 2 + 1 (i.e. signed min cast to unsigned). - template <typename T> --constexpr typename std::make_signed<T>::type ConditionalNegate( -+typename std::make_signed<T>::type ConditionalNegate( - T x, - bool is_negative) { - static_assert(std::is_integral<T>::value, "Type must be integral"); -@@ -70,7 +70,7 @@ constexpr typename std::make_signed<T>::type ConditionalNegate( - - // This performs a safe, absolute value via unsigned overflow. - template <typename T> --constexpr typename std::make_unsigned<T>::type SafeUnsignedAbs(T value) { -+typename std::make_unsigned<T>::type SafeUnsignedAbs(T value) { - static_assert(std::is_integral<T>::value, "Type must be integral"); - using UnsignedT = typename std::make_unsigned<T>::type; - return IsValueNegative(value) ? 0 - static_cast<UnsignedT>(value) -@@ -141,20 +141,20 @@ struct StaticDstRangeRelationToSrcRange<Dst, - // can identify constants and eliminate unused code paths. - class RangeCheck { - public: -- constexpr RangeCheck(bool is_in_lower_bound, bool is_in_upper_bound) -+ RangeCheck(bool is_in_lower_bound, bool is_in_upper_bound) - : is_underflow_(!is_in_lower_bound), is_overflow_(!is_in_upper_bound) {} -- constexpr RangeCheck() : is_underflow_(0), is_overflow_(0) {} -- constexpr bool IsValid() const { return !is_overflow_ && !is_underflow_; } -- constexpr bool IsInvalid() const { return is_overflow_ && is_underflow_; } -- constexpr bool IsOverflow() const { return is_overflow_ && !is_underflow_; } -- constexpr bool IsUnderflow() const { return !is_overflow_ && is_underflow_; } -- constexpr bool IsOverflowFlagSet() const { return is_overflow_; } -- constexpr bool IsUnderflowFlagSet() const { return is_underflow_; } -- constexpr bool operator==(const RangeCheck rhs) const { -+ RangeCheck() : is_underflow_(0), is_overflow_(0) {} -+ bool IsValid() const { return !is_overflow_ && !is_underflow_; } -+ bool IsInvalid() const { return is_overflow_ && is_underflow_; } -+ bool IsOverflow() const { return is_overflow_ && !is_underflow_; } -+ bool IsUnderflow() const { return !is_overflow_ && is_underflow_; } -+ bool IsOverflowFlagSet() const { return is_overflow_; } -+ bool IsUnderflowFlagSet() const { return is_underflow_; } -+ bool operator==(const RangeCheck rhs) const { - return is_underflow_ == rhs.is_underflow_ && - is_overflow_ == rhs.is_overflow_; - } -- constexpr bool operator!=(const RangeCheck rhs) const { -+ bool operator!=(const RangeCheck rhs) const { - return !(*this == rhs); - } - -@@ -203,7 +203,7 @@ struct NarrowingRange { - - // Masks out the integer bits that are beyond the precision of the - // intermediate type used for comparison. -- static constexpr T Adjust(T value) { -+ static T Adjust(T value) { - static_assert(std::is_same<T, Dst>::value, ""); - static_assert(kShift < DstLimits::digits, ""); - return static_cast<T>( -@@ -214,14 +214,14 @@ struct NarrowingRange { - template <typename T, - typename std::enable_if<std::is_floating_point<T>::value>::type* = - nullptr> -- static constexpr T Adjust(T value) { -+ static T Adjust(T value) { - static_assert(std::is_same<T, Dst>::value, ""); - static_assert(kShift == 0, ""); - return value; - } - -- static constexpr Dst max() { return Adjust(Bounds<Dst>::max()); } -- static constexpr Dst lowest() { return Adjust(Bounds<Dst>::lowest()); } -+ static Dst max() { return Adjust(Bounds<Dst>::max()); } -+ static Dst lowest() { return Adjust(Bounds<Dst>::lowest()); } - }; - - template <typename Dst, -@@ -253,7 +253,7 @@ struct DstRangeRelationToSrcRangeImpl<Dst, - DstSign, - SrcSign, - NUMERIC_RANGE_CONTAINED> { -- static constexpr RangeCheck Check(Src value) { -+ static RangeCheck Check(Src value) { - using SrcLimits = std::numeric_limits<Src>; - using DstLimits = NarrowingRange<Dst, Src, Bounds>; - return RangeCheck( -@@ -273,7 +273,7 @@ struct DstRangeRelationToSrcRangeImpl<Dst, - INTEGER_REPRESENTATION_SIGNED, - INTEGER_REPRESENTATION_SIGNED, - NUMERIC_RANGE_NOT_CONTAINED> { -- static constexpr RangeCheck Check(Src value) { -+ static RangeCheck Check(Src value) { - using DstLimits = NarrowingRange<Dst, Src, Bounds>; - return RangeCheck(value >= DstLimits::lowest(), value <= DstLimits::max()); - } -@@ -288,7 +288,7 @@ struct DstRangeRelationToSrcRangeImpl<Dst, - INTEGER_REPRESENTATION_UNSIGNED, - INTEGER_REPRESENTATION_UNSIGNED, - NUMERIC_RANGE_NOT_CONTAINED> { -- static constexpr RangeCheck Check(Src value) { -+ static RangeCheck Check(Src value) { - using DstLimits = NarrowingRange<Dst, Src, Bounds>; - return RangeCheck( - DstLimits::lowest() == Dst(0) || value >= DstLimits::lowest(), -@@ -304,7 +304,7 @@ struct DstRangeRelationToSrcRangeImpl<Dst, - INTEGER_REPRESENTATION_SIGNED, - INTEGER_REPRESENTATION_UNSIGNED, - NUMERIC_RANGE_NOT_CONTAINED> { -- static constexpr RangeCheck Check(Src value) { -+ static RangeCheck Check(Src value) { - using DstLimits = NarrowingRange<Dst, Src, Bounds>; - using Promotion = decltype(Src() + Dst()); - return RangeCheck(DstLimits::lowest() <= Dst(0) || -@@ -324,7 +324,7 @@ struct DstRangeRelationToSrcRangeImpl<Dst, - INTEGER_REPRESENTATION_UNSIGNED, - INTEGER_REPRESENTATION_SIGNED, - NUMERIC_RANGE_NOT_CONTAINED> { -- static constexpr RangeCheck Check(Src value) { -+ static RangeCheck Check(Src value) { - using SrcLimits = std::numeric_limits<Src>; - using DstLimits = NarrowingRange<Dst, Src, Bounds>; - using Promotion = decltype(Src() + Dst()); -@@ -341,10 +341,9 @@ struct DstRangeRelationToSrcRangeImpl<Dst, - template <typename Dst, - template <typename> class Bounds = std::numeric_limits, - typename Src> --constexpr RangeCheck DstRangeRelationToSrcRange(Src value) { -+RangeCheck DstRangeRelationToSrcRange(Src value) { - static_assert(std::is_arithmetic<Src>::value, "Argument must be numeric."); - static_assert(std::is_arithmetic<Dst>::value, "Result must be numeric."); -- static_assert(Bounds<Dst>::lowest() < Bounds<Dst>::max(), ""); - return DstRangeRelationToSrcRangeImpl<Dst, Src, Bounds>::Check(value); - } - -@@ -603,7 +602,7 @@ struct IsStrictOp { - }; - - template <typename L, typename R> --constexpr bool IsLessImpl(const L lhs, -+bool IsLessImpl(const L lhs, - const R rhs, - const RangeCheck l_range, - const RangeCheck r_range) { -@@ -617,14 +616,14 @@ template <typename L, typename R> - struct IsLess { - static_assert(std::is_arithmetic<L>::value && std::is_arithmetic<R>::value, - "Types must be numeric."); -- static constexpr bool Test(const L lhs, const R rhs) { -+ static bool Test(const L lhs, const R rhs) { - return IsLessImpl(lhs, rhs, DstRangeRelationToSrcRange<R>(lhs), - DstRangeRelationToSrcRange<L>(rhs)); - } - }; - - template <typename L, typename R> --constexpr bool IsLessOrEqualImpl(const L lhs, -+bool IsLessOrEqualImpl(const L lhs, - const R rhs, - const RangeCheck l_range, - const RangeCheck r_range) { -@@ -638,14 +637,14 @@ template <typename L, typename R> - struct IsLessOrEqual { - static_assert(std::is_arithmetic<L>::value && std::is_arithmetic<R>::value, - "Types must be numeric."); -- static constexpr bool Test(const L lhs, const R rhs) { -+ static bool Test(const L lhs, const R rhs) { - return IsLessOrEqualImpl(lhs, rhs, DstRangeRelationToSrcRange<R>(lhs), - DstRangeRelationToSrcRange<L>(rhs)); - } - }; - - template <typename L, typename R> --constexpr bool IsGreaterImpl(const L lhs, -+bool IsGreaterImpl(const L lhs, - const R rhs, - const RangeCheck l_range, - const RangeCheck r_range) { -@@ -659,14 +658,14 @@ template <typename L, typename R> - struct IsGreater { - static_assert(std::is_arithmetic<L>::value && std::is_arithmetic<R>::value, - "Types must be numeric."); -- static constexpr bool Test(const L lhs, const R rhs) { -+ static bool Test(const L lhs, const R rhs) { - return IsGreaterImpl(lhs, rhs, DstRangeRelationToSrcRange<R>(lhs), - DstRangeRelationToSrcRange<L>(rhs)); - } - }; - - template <typename L, typename R> --constexpr bool IsGreaterOrEqualImpl(const L lhs, -+bool IsGreaterOrEqualImpl(const L lhs, - const R rhs, - const RangeCheck l_range, - const RangeCheck r_range) { -@@ -680,7 +679,7 @@ template <typename L, typename R> - struct IsGreaterOrEqual { - static_assert(std::is_arithmetic<L>::value && std::is_arithmetic<R>::value, - "Types must be numeric."); -- static constexpr bool Test(const L lhs, const R rhs) { -+ static bool Test(const L lhs, const R rhs) { - return IsGreaterOrEqualImpl(lhs, rhs, DstRangeRelationToSrcRange<R>(lhs), - DstRangeRelationToSrcRange<L>(rhs)); - } -@@ -690,7 +689,7 @@ template <typename L, typename R> - struct IsEqual { - static_assert(std::is_arithmetic<L>::value && std::is_arithmetic<R>::value, - "Types must be numeric."); -- static constexpr bool Test(const L lhs, const R rhs) { -+ static bool Test(const L lhs, const R rhs) { - return DstRangeRelationToSrcRange<R>(lhs) == - DstRangeRelationToSrcRange<L>(rhs) && - static_cast<decltype(lhs + rhs)>(lhs) == -@@ -702,7 +701,7 @@ template <typename L, typename R> - struct IsNotEqual { - static_assert(std::is_arithmetic<L>::value && std::is_arithmetic<R>::value, - "Types must be numeric."); -- static constexpr bool Test(const L lhs, const R rhs) { -+ static bool Test(const L lhs, const R rhs) { - return DstRangeRelationToSrcRange<R>(lhs) != - DstRangeRelationToSrcRange<L>(rhs) || - static_cast<decltype(lhs + rhs)>(lhs) != -@@ -713,7 +712,7 @@ struct IsNotEqual { - // These perform the actual math operations on the CheckedNumerics. - // Binary arithmetic operations. - template <template <typename, typename> class C, typename L, typename R> --constexpr bool SafeCompare(const L lhs, const R rhs) { -+bool SafeCompare(const L lhs, const R rhs) { - static_assert(std::is_arithmetic<L>::value && std::is_arithmetic<R>::value, - "Types must be numeric."); - using Promotion = BigEnoughPromotion<L, R>; -diff --git a/third_party/base/numerics/safe_math.h b/third_party/base/numerics/safe_math.h -index a0c41a4..590a5d8 100644 ---- a/third_party/base/numerics/safe_math.h -+++ b/third_party/base/numerics/safe_math.h -@@ -100,11 +100,11 @@ class CheckedNumeric { - public: - using type = T; - -- constexpr CheckedNumeric() {} -+ CheckedNumeric() {} - - // Copy constructor. - template <typename Src> -- constexpr CheckedNumeric(const CheckedNumeric<Src>& rhs) -+ CheckedNumeric(const CheckedNumeric<Src>& rhs) - : state_(rhs.state_.value(), rhs.IsValid()) {} - - template <typename Src> -@@ -113,7 +113,7 @@ class CheckedNumeric { - // This is not an explicit constructor because we implicitly upgrade regular - // numerics to CheckedNumerics to make them easier to use. - template <typename Src> -- constexpr CheckedNumeric(Src value) // NOLINT(runtime/explicit) -+ CheckedNumeric(Src value) // NOLINT(runtime/explicit) - : state_(value) { - static_assert(std::is_arithmetic<Src>::value, "Argument must be numeric."); - } -@@ -121,7 +121,7 @@ class CheckedNumeric { - // This is not an explicit constructor because we want a seamless conversion - // from StrictNumeric types. - template <typename Src> -- constexpr CheckedNumeric( -+ CheckedNumeric( - StrictNumeric<Src> value) // NOLINT(runtime/explicit) - : state_(static_cast<Src>(value)) {} - -@@ -129,7 +129,7 @@ class CheckedNumeric { - // A range checked destination type can be supplied using the Dst template - // parameter. - template <typename Dst = T> -- constexpr bool IsValid() const { -+ bool IsValid() const { - return state_.is_valid() && - IsValueInRangeForNumericType<Dst>(state_.value()); - } -@@ -138,7 +138,7 @@ class CheckedNumeric { - // and is within the range supported by the destination type. Returns true if - // successful and false otherwise. - template <typename Dst> -- constexpr bool AssignIfValid(Dst* result) const { -+ bool AssignIfValid(Dst* result) const { - return IsValid<Dst>() ? ((*result = static_cast<Dst>(state_.value())), true) - : false; - } -@@ -152,7 +152,7 @@ class CheckedNumeric { - // template parameter, for test code, etc. However, the handler cannot access - // the underlying value, and it is not available through other means. - template <typename Dst = T, class CheckHandler = CheckOnFailure> -- constexpr StrictNumeric<Dst> ValueOrDie() const { -+ StrictNumeric<Dst> ValueOrDie() const { - return IsValid<Dst>() ? static_cast<Dst>(state_.value()) - : CheckHandler::template HandleFailure<Dst>(); - } -@@ -164,7 +164,7 @@ class CheckedNumeric { - // parameter. WARNING: This function may fail to compile or CHECK at runtime - // if the supplied default_value is not within range of the destination type. - template <typename Dst = T, typename Src> -- constexpr StrictNumeric<Dst> ValueOrDefault(const Src default_value) const { -+ StrictNumeric<Dst> ValueOrDefault(const Src default_value) const { - return IsValid<Dst>() ? static_cast<Dst>(state_.value()) - : checked_cast<Dst>(default_value); - } -@@ -173,7 +173,7 @@ class CheckedNumeric { - // CheckedNumeric. If the current state is invalid or the destination cannot - // represent the result then the returned CheckedNumeric will be invalid. - template <typename Dst> -- constexpr CheckedNumeric<typename UnderlyingType<Dst>::type> Cast() const { -+ CheckedNumeric<typename UnderlyingType<Dst>::type> Cast() const { - return *this; - } - -@@ -205,7 +205,7 @@ class CheckedNumeric { - template <typename Src> - CheckedNumeric& operator^=(const Src rhs); - -- constexpr CheckedNumeric operator-() const { -+ CheckedNumeric operator-() const { - return CheckedNumeric<T>( - NegateWrapper(state_.value()), - IsValid() && -@@ -214,12 +214,12 @@ class CheckedNumeric { - std::numeric_limits<T>::lowest())); - } - -- constexpr CheckedNumeric operator~() const { -+ CheckedNumeric operator~() const { - return CheckedNumeric<decltype(InvertWrapper(T()))>( - InvertWrapper(state_.value()), IsValid()); - } - -- constexpr CheckedNumeric Abs() const { -+ CheckedNumeric Abs() const { - return CheckedNumeric<T>( - AbsWrapper(state_.value()), - IsValid() && -@@ -228,7 +228,7 @@ class CheckedNumeric { - } - - template <typename U> -- constexpr CheckedNumeric<typename MathWrapper<CheckedMaxOp, T, U>::type> Max( -+ CheckedNumeric<typename MathWrapper<CheckedMaxOp, T, U>::type> Max( - const U rhs) const { - using R = typename UnderlyingType<U>::type; - using result_type = typename MathWrapper<CheckedMaxOp, T, U>::type; -@@ -243,7 +243,7 @@ class CheckedNumeric { - } - - template <typename U> -- constexpr CheckedNumeric<typename MathWrapper<CheckedMinOp, T, U>::type> Min( -+ CheckedNumeric<typename MathWrapper<CheckedMinOp, T, U>::type> Min( - const U rhs) const { - using R = typename UnderlyingType<U>::type; - using result_type = typename MathWrapper<CheckedMinOp, T, U>::type; -@@ -260,7 +260,7 @@ class CheckedNumeric { - // This function is available only for integral types. It returns an unsigned - // integer of the same width as the source type, containing the absolute value - // of the source, and properly handling signed min. -- constexpr CheckedNumeric<typename UnsignedOrFloatForSize<T>::type> -+ CheckedNumeric<typename UnsignedOrFloatForSize<T>::type> - UnsignedAbs() const { - return CheckedNumeric<typename UnsignedOrFloatForSize<T>::type>( - SafeUnsignedAbs(state_.value()), state_.is_valid()); -@@ -317,31 +317,31 @@ class CheckedNumeric { - CheckedNumericState<T> state_; - - template <typename Src> -- constexpr CheckedNumeric(Src value, bool is_valid) -+ CheckedNumeric(Src value, bool is_valid) - : state_(value, is_valid) {} - - // These wrappers allow us to handle state the same way for both - // CheckedNumeric and POD arithmetic types. - template <typename Src> - struct Wrapper { -- static constexpr bool is_valid(Src) { return true; } -- static constexpr Src value(Src value) { return value; } -+ static bool is_valid(Src) { return true; } -+ static Src value(Src value) { return value; } - }; - - template <typename Src> - struct Wrapper<CheckedNumeric<Src>> { -- static constexpr bool is_valid(const CheckedNumeric<Src> v) { -+ static bool is_valid(const CheckedNumeric<Src> v) { - return v.IsValid(); - } -- static constexpr Src value(const CheckedNumeric<Src> v) { -+ static Src value(const CheckedNumeric<Src> v) { - return v.state_.value(); - } - }; - - template <typename Src> - struct Wrapper<StrictNumeric<Src>> { -- static constexpr bool is_valid(const StrictNumeric<Src>) { return true; } -- static constexpr Src value(const StrictNumeric<Src> v) { -+ static bool is_valid(const StrictNumeric<Src>) { return true; } -+ static Src value(const StrictNumeric<Src> v) { - return static_cast<Src>(v); - } - }; -@@ -349,18 +349,18 @@ class CheckedNumeric { - - // Convenience functions to avoid the ugly template disambiguator syntax. - template <typename Dst, typename Src> --constexpr bool IsValidForType(const CheckedNumeric<Src> value) { -+bool IsValidForType(const CheckedNumeric<Src> value) { - return value.template IsValid<Dst>(); - } - - template <typename Dst, typename Src> --constexpr StrictNumeric<Dst> ValueOrDieForType( -+StrictNumeric<Dst> ValueOrDieForType( - const CheckedNumeric<Src> value) { - return value.template ValueOrDie<Dst>(); - } - - template <typename Dst, typename Src, typename Default> --constexpr StrictNumeric<Dst> ValueOrDefaultForType( -+StrictNumeric<Dst> ValueOrDefaultForType( - const CheckedNumeric<Src> value, - const Default default_value) { - return value.template ValueOrDefault<Dst>(default_value); -@@ -393,7 +393,7 @@ struct ResultType { - // Convience wrapper to return a new CheckedNumeric from the provided arithmetic - // or CheckedNumericType. - template <typename T> --constexpr CheckedNumeric<typename UnderlyingType<T>::type> MakeCheckedNum( -+CheckedNumeric<typename UnderlyingType<T>::type> MakeCheckedNum( - const T value) { - return value; - } -diff --git a/third_party/base/numerics/safe_math_impl.h b/third_party/base/numerics/safe_math_impl.h -index 5ad79ce..76d6b0d 100644 ---- a/third_party/base/numerics/safe_math_impl.h -+++ b/third_party/base/numerics/safe_math_impl.h -@@ -474,7 +474,7 @@ BASE_FLOAT_ARITHMETIC_OPS(Div, /) - - template <typename T, - typename std::enable_if<std::is_integral<T>::value>::type* = nullptr> --constexpr T NegateWrapper(T value) { -+T NegateWrapper(T value) { - using UnsignedT = typename std::make_unsigned<T>::type; - // This will compile to a NEG on Intel, and is normal negation on ARM. - return static_cast<T>(UnsignedT(0) - static_cast<UnsignedT>(value)); -@@ -483,26 +483,26 @@ constexpr T NegateWrapper(T value) { - template < - typename T, - typename std::enable_if<std::is_floating_point<T>::value>::type* = nullptr> --constexpr T NegateWrapper(T value) { -+T NegateWrapper(T value) { - return -value; - } - - template <typename T, - typename std::enable_if<std::is_integral<T>::value>::type* = nullptr> --constexpr typename std::make_unsigned<T>::type InvertWrapper(T value) { -+typename std::make_unsigned<T>::type InvertWrapper(T value) { - return ~value; - } - - template <typename T, - typename std::enable_if<std::is_integral<T>::value>::type* = nullptr> --constexpr T AbsWrapper(T value) { -+T AbsWrapper(T value) { - return static_cast<T>(SafeUnsignedAbs(value)); - } - - template < - typename T, - typename std::enable_if<std::is_floating_point<T>::value>::type* = nullptr> --constexpr T AbsWrapper(T value) { -+T AbsWrapper(T value) { - return value < 0 ? -value : value; - } - -@@ -540,7 +540,7 @@ class CheckedNumericState<T, NUMERIC_INTEGER> { - - // Ensures that a type conversion does not trigger undefined behavior. - template <typename Src> -- static constexpr T WellDefinedConversionOrZero(const Src value, -+ static T WellDefinedConversionOrZero(const Src value, - const bool is_valid) { - using SrcType = typename internal::UnderlyingType<Src>::type; - return (std::is_integral<SrcType>::value || is_valid) -@@ -552,10 +552,10 @@ class CheckedNumericState<T, NUMERIC_INTEGER> { - template <typename Src, NumericRepresentation type> - friend class CheckedNumericState; - -- constexpr CheckedNumericState() : is_valid_(true), value_(0) {} -+ CheckedNumericState() : is_valid_(true), value_(0) {} - - template <typename Src> -- constexpr CheckedNumericState(Src value, bool is_valid) -+ CheckedNumericState(Src value, bool is_valid) - : is_valid_(is_valid && IsValueInRangeForNumericType<T>(value)), - value_(WellDefinedConversionOrZero(value, is_valid_)) { - static_assert(std::is_arithmetic<Src>::value, "Argument must be numeric."); -@@ -563,17 +563,17 @@ class CheckedNumericState<T, NUMERIC_INTEGER> { - - // Copy constructor. - template <typename Src> -- constexpr CheckedNumericState(const CheckedNumericState<Src>& rhs) -+ CheckedNumericState(const CheckedNumericState<Src>& rhs) - : is_valid_(rhs.IsValid()), - value_(WellDefinedConversionOrZero(rhs.value(), is_valid_)) {} - - template <typename Src> -- constexpr explicit CheckedNumericState(Src value) -+ explicit CheckedNumericState(Src value) - : is_valid_(IsValueInRangeForNumericType<T>(value)), - value_(WellDefinedConversionOrZero(value, is_valid_)) {} - -- constexpr bool is_valid() const { return is_valid_; } -- constexpr T value() const { return value_; } -+ bool is_valid() const { return is_valid_; } -+ T value() const { return value_; } - }; - - // Floating points maintain their own validity, but need translation wrappers. -@@ -584,7 +584,7 @@ class CheckedNumericState<T, NUMERIC_FLOATING> { - - // Ensures that a type conversion does not trigger undefined behavior. - template <typename Src> -- static constexpr T WellDefinedConversionOrNaN(const Src value, -+ static T WellDefinedConversionOrNaN(const Src value, - const bool is_valid) { - using SrcType = typename internal::UnderlyingType<Src>::type; - return (StaticDstRangeRelationToSrcRange<T, SrcType>::value == -@@ -598,32 +598,32 @@ class CheckedNumericState<T, NUMERIC_FLOATING> { - template <typename Src, NumericRepresentation type> - friend class CheckedNumericState; - -- constexpr CheckedNumericState() : value_(0.0) {} -+ CheckedNumericState() : value_(0.0) {} - - template <typename Src> -- constexpr CheckedNumericState(Src value, bool is_valid) -+ CheckedNumericState(Src value, bool is_valid) - : value_(WellDefinedConversionOrNaN(value, is_valid)) {} - - template <typename Src> -- constexpr explicit CheckedNumericState(Src value) -+ explicit CheckedNumericState(Src value) - : value_(WellDefinedConversionOrNaN( - value, - IsValueInRangeForNumericType<T>(value))) {} - - // Copy constructor. - template <typename Src> -- constexpr CheckedNumericState(const CheckedNumericState<Src>& rhs) -+ CheckedNumericState(const CheckedNumericState<Src>& rhs) - : value_(WellDefinedConversionOrNaN( - rhs.value(), - rhs.is_valid() && IsValueInRangeForNumericType<T>(rhs.value()))) {} - -- constexpr bool is_valid() const { -+ bool is_valid() const { - // Written this way because std::isfinite is not reliably constexpr. - // TODO(jschuh): Fix this if the libraries ever get fixed. - return value_ <= std::numeric_limits<T>::max() && - value_ >= std::numeric_limits<T>::lowest(); - } -- constexpr T value() const { return value_; } -+ T value() const { return value_; } - }; - - template <template <typename, typename, typename> class M, -diff --git a/third_party/base/stl_util.h b/third_party/base/stl_util.h -index 795414b..cec9ea3 100644 ---- a/third_party/base/stl_util.h -+++ b/third_party/base/stl_util.h -@@ -33,7 +33,6 @@ bool ContainsValue(const Collection& collection, const Value& value) { - template <class T> - class FakeUniquePtr : public std::unique_ptr<T> { - public: -- using std::unique_ptr<T>::unique_ptr; - ~FakeUniquePtr() { std::unique_ptr<T>::release(); } - }; - |