Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9d637824 authored by Ryan Prichard's avatar Ryan Prichard Committed by Cherrypicker Worker
Browse files

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
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:42d2e51bf78bec72031e5f7a70422851b302d1f4)
Merged-In: I9ab51f29724fded24773344aa36763ffeea02d00
Change-Id: I9ab51f29724fded24773344aa36763ffeea02d00
parent d74c2a17
Loading
Loading
Loading
Loading
+8 −4
Original line number Diff line number Diff line
@@ -216,9 +216,7 @@ class SupportsScreen;

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 @@ class ManifestExtractor {

 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 @@ static void ToProto(ManifestExtractor::Element* el, pb::Badging* out_badging) {
  }
}

// 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);