Fix std::unique_ptr error with incomplete CommonFeatureGroup
After upgrading libc++, Clang fails to compile DumpManifest.cpp.
prebuilts/clang/host/linux-x86/clang-r498229/include/c++/v1/__memory/unique_ptr.h:63:19: error: invalid application of 'sizeof' to an incomplete type 'aapt::CommonFeatureGroup'
static_assert(sizeof(_Tp) >= 0, "cannot delete an incomplete type");
^~~~~~~~~~~
Fix the problem by deferring the instantiation of ~unique_ptr, by
making the ManifestExtractor constructor out-of-line and moving it and
the initialization of commonFeatureGroup_ to a point after
CommonFeatureGroup has been defined.
Bug: b/175635923
Test: treehugger
Change-Id: I9ab51f29724fded24773344aa36763ffeea02d00
diff --git a/tools/aapt2/dump/DumpManifest.cpp b/tools/aapt2/dump/DumpManifest.cpp
index 6bf265d..a2b4818 100644
--- a/tools/aapt2/dump/DumpManifest.cpp
+++ b/tools/aapt2/dump/DumpManifest.cpp
@@ -216,9 +216,7 @@
class ManifestExtractor {
public:
-
- explicit ManifestExtractor(LoadedApk* apk, DumpManifestOptions& options)
- : apk_(apk), options_(options) { }
+ explicit ManifestExtractor(LoadedApk* apk, DumpManifestOptions& options);
class Element {
public:
@@ -509,7 +507,7 @@
private:
std::unique_ptr<xml::XmlResource> doc_;
- std::unique_ptr<CommonFeatureGroup> commonFeatureGroup_ = util::make_unique<CommonFeatureGroup>();
+ std::unique_ptr<CommonFeatureGroup> commonFeatureGroup_;
std::map<std::string, ConfigDescription> locales_;
std::map<uint16_t, ConfigDescription> densities_;
std::vector<Element*> parent_stack_;
@@ -2471,6 +2469,12 @@
}
}
+// Define this constructor after the CommonFeatureGroup class definition to avoid errors with using
+// std::unique_ptr on an incomplete type.
+ManifestExtractor::ManifestExtractor(LoadedApk* apk, DumpManifestOptions& options)
+ : apk_(apk), options_(options), commonFeatureGroup_(util::make_unique<CommonFeatureGroup>()) {
+}
+
bool ManifestExtractor::Extract(android::IDiagnostics* diag) {
// Load the manifest
doc_ = apk_->LoadXml("AndroidManifest.xml", diag);