Skip to content

Revert "[Clang] Reduce the size of Decl and classes derived from it" #88654

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Apr 14, 2024

Conversation

philnik777
Copy link
Contributor

Reverts #87361

On 32 bit platforms there is only a single bit available in the DeclCtx, resulting in an assertion failure.

@llvmbot llvmbot added clang Clang issues not falling into any other category clang:frontend Language frontend issues, e.g. anything involving "Sema" clang:modules C++20 modules and Clang Header Modules labels Apr 14, 2024
@philnik777 philnik777 merged commit ed06b84 into main Apr 14, 2024
6 of 8 checks passed
@philnik777 philnik777 deleted the revert-87361-reduce_decl_size branch April 14, 2024 10:25
@llvmbot
Copy link
Member

llvmbot commented Apr 14, 2024

@llvm/pr-subscribers-clang-modules

Author: Nikolas Klauser (philnik777)

Changes

Reverts llvm/llvm-project#87361

On 32 bit platforms there is only a single bit available in the DeclCtx, resulting in an assertion failure.


Full diff: https://github.com/llvm/llvm-project/pull/88654.diff

3 Files Affected:

  • (modified) clang/include/clang/AST/DeclBase.h (+25-47)
  • (modified) clang/lib/AST/DeclBase.cpp (+9-22)
  • (modified) clang/lib/Serialization/ASTReaderDecl.cpp (+1-1)
diff --git a/clang/include/clang/AST/DeclBase.h b/clang/include/clang/AST/DeclBase.h
index 4bee18767dd11b..858450926455c6 100644
--- a/clang/include/clang/AST/DeclBase.h
+++ b/clang/include/clang/AST/DeclBase.h
@@ -268,37 +268,17 @@ class alignas(8) Decl {
   ///   }
   ///   void A::f(); // SemanticDC == namespace 'A'
   ///                // LexicalDC == global namespace
+  llvm::PointerUnion<DeclContext*, MultipleDC*> DeclCtx;
 
-  // Compress the InvalidDecl and HasAttrs bits into DeclCtx to keep Decl below
-  // 32 bytes in size
-  llvm::PointerIntPair<
-      llvm::PointerIntPair<llvm::PointerUnion<DeclContext *, MultipleDC *>, 1,
-                           bool>,
-      1, bool>
-      DeclCtxWithInvalidDeclAndHasAttrs;
-
-  bool isInSemaDC() const {
-    return DeclCtxWithInvalidDeclAndHasAttrs.getPointer()
-        .getPointer()
-        .is<DeclContext *>();
-  }
-
-  bool isOutOfSemaDC() const {
-    return DeclCtxWithInvalidDeclAndHasAttrs.getPointer()
-        .getPointer()
-        .is<MultipleDC *>();
-  }
+  bool isInSemaDC() const { return DeclCtx.is<DeclContext*>(); }
+  bool isOutOfSemaDC() const { return DeclCtx.is<MultipleDC*>(); }
 
   MultipleDC *getMultipleDC() const {
-    return DeclCtxWithInvalidDeclAndHasAttrs.getPointer()
-        .getPointer()
-        .get<MultipleDC *>();
+    return DeclCtx.get<MultipleDC*>();
   }
 
   DeclContext *getSemanticDC() const {
-    return DeclCtxWithInvalidDeclAndHasAttrs.getPointer()
-        .getPointer()
-        .get<DeclContext *>();
+    return DeclCtx.get<DeclContext*>();
   }
 
   /// Loc - The location of this decl.
@@ -308,6 +288,14 @@ class alignas(8) Decl {
   LLVM_PREFERRED_TYPE(Kind)
   unsigned DeclKind : 7;
 
+  /// InvalidDecl - This indicates a semantic error occurred.
+  LLVM_PREFERRED_TYPE(bool)
+  unsigned InvalidDecl :  1;
+
+  /// HasAttrs - This indicates whether the decl has attributes or not.
+  LLVM_PREFERRED_TYPE(bool)
+  unsigned HasAttrs : 1;
+
   /// Implicit - Whether this declaration was implicitly generated by
   /// the implementation rather than explicitly written by the user.
   LLVM_PREFERRED_TYPE(bool)
@@ -405,22 +393,21 @@ class alignas(8) Decl {
 protected:
   Decl(Kind DK, DeclContext *DC, SourceLocation L)
       : NextInContextAndBits(nullptr, getModuleOwnershipKindForChildOf(DC)),
-        DeclCtxWithInvalidDeclAndHasAttrs({DC, false}, false), Loc(L),
-        DeclKind(DK), Implicit(false), Used(false), Referenced(false),
+        DeclCtx(DC), Loc(L), DeclKind(DK), InvalidDecl(false), HasAttrs(false),
+        Implicit(false), Used(false), Referenced(false),
         TopLevelDeclInObjCContainer(false), Access(AS_none), FromASTFile(0),
         IdentifierNamespace(getIdentifierNamespaceForKind(DK)),
         CacheValidAndLinkage(llvm::to_underlying(Linkage::Invalid)) {
-    if (StatisticsEnabled)
-      add(DK);
+    if (StatisticsEnabled) add(DK);
   }
 
   Decl(Kind DK, EmptyShell Empty)
-      : DeclKind(DK), Implicit(false), Used(false), Referenced(false),
-        TopLevelDeclInObjCContainer(false), Access(AS_none), FromASTFile(0),
+      : DeclKind(DK), InvalidDecl(false), HasAttrs(false), Implicit(false),
+        Used(false), Referenced(false), TopLevelDeclInObjCContainer(false),
+        Access(AS_none), FromASTFile(0),
         IdentifierNamespace(getIdentifierNamespaceForKind(DK)),
         CacheValidAndLinkage(llvm::to_underlying(Linkage::Invalid)) {
-    if (StatisticsEnabled)
-      add(DK);
+    if (StatisticsEnabled) add(DK);
   }
 
   virtual ~Decl();
@@ -533,9 +520,7 @@ class alignas(8) Decl {
     return AccessSpecifier(Access);
   }
 
-  bool hasAttrs() const {
-    return DeclCtxWithInvalidDeclAndHasAttrs.getPointer().getInt();
-  }
+  bool hasAttrs() const { return HasAttrs; }
 
   void setAttrs(const AttrVec& Attrs) {
     return setAttrsImpl(Attrs, getASTContext());
@@ -564,17 +549,13 @@ class alignas(8) Decl {
   }
 
   template <typename... Ts> void dropAttrs() {
-    if (!hasAttrs())
-      return;
+    if (!HasAttrs) return;
 
     AttrVec &Vec = getAttrs();
     llvm::erase_if(Vec, [](Attr *A) { return isa<Ts...>(A); });
 
-    if (Vec.empty()) {
-      auto InnerPtr = DeclCtxWithInvalidDeclAndHasAttrs.getPointer();
-      InnerPtr.setInt(false);
-      DeclCtxWithInvalidDeclAndHasAttrs.setPointer(InnerPtr);
-    }
+    if (Vec.empty())
+      HasAttrs = false;
   }
 
   template <typename T> void dropAttr() { dropAttrs<T>(); }
@@ -609,10 +590,7 @@ class alignas(8) Decl {
   /// setInvalidDecl - Indicates the Decl had a semantic error. This
   /// allows for graceful error recovery.
   void setInvalidDecl(bool Invalid = true);
-
-  bool isInvalidDecl() const {
-    return DeclCtxWithInvalidDeclAndHasAttrs.getInt();
-  }
+  bool isInvalidDecl() const { return (bool) InvalidDecl; }
 
   /// isImplicit - Indicates whether the declaration was implicitly
   /// generated by the implementation. If false, this declaration
diff --git a/clang/lib/AST/DeclBase.cpp b/clang/lib/AST/DeclBase.cpp
index 8c83c711d882d9..66a727d9dd0c39 100644
--- a/clang/lib/AST/DeclBase.cpp
+++ b/clang/lib/AST/DeclBase.cpp
@@ -52,8 +52,6 @@
 
 using namespace clang;
 
-static_assert(sizeof(Decl) <= 32, "Decl grew beyond 32 bytes!");
-
 //===----------------------------------------------------------------------===//
 //  Statistics
 //===----------------------------------------------------------------------===//
@@ -132,7 +130,7 @@ const char *Decl::getDeclKindName() const {
 }
 
 void Decl::setInvalidDecl(bool Invalid) {
-  DeclCtxWithInvalidDeclAndHasAttrs.setInt(Invalid);
+  InvalidDecl = Invalid;
   assert(!isa<TagDecl>(this) || !cast<TagDecl>(this)->isCompleteDefinition());
   if (!Invalid) {
     return;
@@ -336,9 +334,7 @@ void PrettyStackTraceDecl::print(raw_ostream &OS) const {
 Decl::~Decl() = default;
 
 void Decl::setDeclContext(DeclContext *DC) {
-  auto InnerPtr = DeclCtxWithInvalidDeclAndHasAttrs.getPointer();
-  InnerPtr.setPointer(DC);
-  DeclCtxWithInvalidDeclAndHasAttrs.setPointer(InnerPtr);
+  DeclCtx = DC;
 }
 
 void Decl::setLexicalDeclContext(DeclContext *DC) {
@@ -368,16 +364,12 @@ void Decl::setLexicalDeclContext(DeclContext *DC) {
 void Decl::setDeclContextsImpl(DeclContext *SemaDC, DeclContext *LexicalDC,
                                ASTContext &Ctx) {
   if (SemaDC == LexicalDC) {
-    auto InnerPtr = DeclCtxWithInvalidDeclAndHasAttrs.getPointer();
-    InnerPtr.setPointer(SemaDC);
-    DeclCtxWithInvalidDeclAndHasAttrs.setPointer(InnerPtr);
+    DeclCtx = SemaDC;
   } else {
     auto *MDC = new (Ctx) Decl::MultipleDC();
     MDC->SemanticDC = SemaDC;
     MDC->LexicalDC = LexicalDC;
-    auto InnerPtr = DeclCtxWithInvalidDeclAndHasAttrs.getPointer();
-    InnerPtr.setPointer(MDC);
-    DeclCtxWithInvalidDeclAndHasAttrs.setPointer(InnerPtr);
+    DeclCtx = MDC;
   }
 }
 
@@ -964,24 +956,19 @@ unsigned Decl::getIdentifierNamespaceForKind(Kind DeclKind) {
 }
 
 void Decl::setAttrsImpl(const AttrVec &attrs, ASTContext &Ctx) {
-  assert(!hasAttrs() && "Decl already contains attrs.");
+  assert(!HasAttrs && "Decl already contains attrs.");
 
   AttrVec &AttrBlank = Ctx.getDeclAttrs(this);
   assert(AttrBlank.empty() && "HasAttrs was wrong?");
 
   AttrBlank = attrs;
-  auto InnerPtr = DeclCtxWithInvalidDeclAndHasAttrs.getPointer();
-  InnerPtr.setInt(true);
-  DeclCtxWithInvalidDeclAndHasAttrs.setPointer(InnerPtr);
+  HasAttrs = true;
 }
 
 void Decl::dropAttrs() {
-  if (!hasAttrs())
-    return;
+  if (!HasAttrs) return;
 
-  auto InnerPtr = DeclCtxWithInvalidDeclAndHasAttrs.getPointer();
-  InnerPtr.setInt(false);
-  DeclCtxWithInvalidDeclAndHasAttrs.setPointer(InnerPtr);
+  HasAttrs = false;
   getASTContext().eraseDeclAttrs(this);
 }
 
@@ -1009,7 +996,7 @@ void Decl::addAttr(Attr *A) {
 }
 
 const AttrVec &Decl::getAttrs() const {
-  assert(hasAttrs() && "No attrs to get!");
+  assert(HasAttrs && "No attrs to get!");
   return getASTContext().getDeclAttrs(this);
 }
 
diff --git a/clang/lib/Serialization/ASTReaderDecl.cpp b/clang/lib/Serialization/ASTReaderDecl.cpp
index c5dd89e1c8a4db..ff72fc30c718f8 100644
--- a/clang/lib/Serialization/ASTReaderDecl.cpp
+++ b/clang/lib/Serialization/ASTReaderDecl.cpp
@@ -588,7 +588,7 @@ void ASTDeclReader::VisitDecl(Decl *D) {
   bool HasStandaloneLexicalDC = DeclBits.getNextBit();
   bool HasAttrs = DeclBits.getNextBit();
   D->setTopLevelDeclInObjCContainer(DeclBits.getNextBit());
-  D->DeclCtxWithInvalidDeclAndHasAttrs.setInt(DeclBits.getNextBit());
+  D->InvalidDecl = DeclBits.getNextBit();
   D->FromASTFile = true;
 
   if (D->isTemplateParameter() || D->isTemplateParameterPack() ||

@llvmbot
Copy link
Member

llvmbot commented Apr 14, 2024

@llvm/pr-subscribers-clang

Author: Nikolas Klauser (philnik777)

Changes

Reverts llvm/llvm-project#87361

On 32 bit platforms there is only a single bit available in the DeclCtx, resulting in an assertion failure.


Full diff: https://github.com/llvm/llvm-project/pull/88654.diff

3 Files Affected:

  • (modified) clang/include/clang/AST/DeclBase.h (+25-47)
  • (modified) clang/lib/AST/DeclBase.cpp (+9-22)
  • (modified) clang/lib/Serialization/ASTReaderDecl.cpp (+1-1)
diff --git a/clang/include/clang/AST/DeclBase.h b/clang/include/clang/AST/DeclBase.h
index 4bee18767dd11b..858450926455c6 100644
--- a/clang/include/clang/AST/DeclBase.h
+++ b/clang/include/clang/AST/DeclBase.h
@@ -268,37 +268,17 @@ class alignas(8) Decl {
   ///   }
   ///   void A::f(); // SemanticDC == namespace 'A'
   ///                // LexicalDC == global namespace
+  llvm::PointerUnion<DeclContext*, MultipleDC*> DeclCtx;
 
-  // Compress the InvalidDecl and HasAttrs bits into DeclCtx to keep Decl below
-  // 32 bytes in size
-  llvm::PointerIntPair<
-      llvm::PointerIntPair<llvm::PointerUnion<DeclContext *, MultipleDC *>, 1,
-                           bool>,
-      1, bool>
-      DeclCtxWithInvalidDeclAndHasAttrs;
-
-  bool isInSemaDC() const {
-    return DeclCtxWithInvalidDeclAndHasAttrs.getPointer()
-        .getPointer()
-        .is<DeclContext *>();
-  }
-
-  bool isOutOfSemaDC() const {
-    return DeclCtxWithInvalidDeclAndHasAttrs.getPointer()
-        .getPointer()
-        .is<MultipleDC *>();
-  }
+  bool isInSemaDC() const { return DeclCtx.is<DeclContext*>(); }
+  bool isOutOfSemaDC() const { return DeclCtx.is<MultipleDC*>(); }
 
   MultipleDC *getMultipleDC() const {
-    return DeclCtxWithInvalidDeclAndHasAttrs.getPointer()
-        .getPointer()
-        .get<MultipleDC *>();
+    return DeclCtx.get<MultipleDC*>();
   }
 
   DeclContext *getSemanticDC() const {
-    return DeclCtxWithInvalidDeclAndHasAttrs.getPointer()
-        .getPointer()
-        .get<DeclContext *>();
+    return DeclCtx.get<DeclContext*>();
   }
 
   /// Loc - The location of this decl.
@@ -308,6 +288,14 @@ class alignas(8) Decl {
   LLVM_PREFERRED_TYPE(Kind)
   unsigned DeclKind : 7;
 
+  /// InvalidDecl - This indicates a semantic error occurred.
+  LLVM_PREFERRED_TYPE(bool)
+  unsigned InvalidDecl :  1;
+
+  /// HasAttrs - This indicates whether the decl has attributes or not.
+  LLVM_PREFERRED_TYPE(bool)
+  unsigned HasAttrs : 1;
+
   /// Implicit - Whether this declaration was implicitly generated by
   /// the implementation rather than explicitly written by the user.
   LLVM_PREFERRED_TYPE(bool)
@@ -405,22 +393,21 @@ class alignas(8) Decl {
 protected:
   Decl(Kind DK, DeclContext *DC, SourceLocation L)
       : NextInContextAndBits(nullptr, getModuleOwnershipKindForChildOf(DC)),
-        DeclCtxWithInvalidDeclAndHasAttrs({DC, false}, false), Loc(L),
-        DeclKind(DK), Implicit(false), Used(false), Referenced(false),
+        DeclCtx(DC), Loc(L), DeclKind(DK), InvalidDecl(false), HasAttrs(false),
+        Implicit(false), Used(false), Referenced(false),
         TopLevelDeclInObjCContainer(false), Access(AS_none), FromASTFile(0),
         IdentifierNamespace(getIdentifierNamespaceForKind(DK)),
         CacheValidAndLinkage(llvm::to_underlying(Linkage::Invalid)) {
-    if (StatisticsEnabled)
-      add(DK);
+    if (StatisticsEnabled) add(DK);
   }
 
   Decl(Kind DK, EmptyShell Empty)
-      : DeclKind(DK), Implicit(false), Used(false), Referenced(false),
-        TopLevelDeclInObjCContainer(false), Access(AS_none), FromASTFile(0),
+      : DeclKind(DK), InvalidDecl(false), HasAttrs(false), Implicit(false),
+        Used(false), Referenced(false), TopLevelDeclInObjCContainer(false),
+        Access(AS_none), FromASTFile(0),
         IdentifierNamespace(getIdentifierNamespaceForKind(DK)),
         CacheValidAndLinkage(llvm::to_underlying(Linkage::Invalid)) {
-    if (StatisticsEnabled)
-      add(DK);
+    if (StatisticsEnabled) add(DK);
   }
 
   virtual ~Decl();
@@ -533,9 +520,7 @@ class alignas(8) Decl {
     return AccessSpecifier(Access);
   }
 
-  bool hasAttrs() const {
-    return DeclCtxWithInvalidDeclAndHasAttrs.getPointer().getInt();
-  }
+  bool hasAttrs() const { return HasAttrs; }
 
   void setAttrs(const AttrVec& Attrs) {
     return setAttrsImpl(Attrs, getASTContext());
@@ -564,17 +549,13 @@ class alignas(8) Decl {
   }
 
   template <typename... Ts> void dropAttrs() {
-    if (!hasAttrs())
-      return;
+    if (!HasAttrs) return;
 
     AttrVec &Vec = getAttrs();
     llvm::erase_if(Vec, [](Attr *A) { return isa<Ts...>(A); });
 
-    if (Vec.empty()) {
-      auto InnerPtr = DeclCtxWithInvalidDeclAndHasAttrs.getPointer();
-      InnerPtr.setInt(false);
-      DeclCtxWithInvalidDeclAndHasAttrs.setPointer(InnerPtr);
-    }
+    if (Vec.empty())
+      HasAttrs = false;
   }
 
   template <typename T> void dropAttr() { dropAttrs<T>(); }
@@ -609,10 +590,7 @@ class alignas(8) Decl {
   /// setInvalidDecl - Indicates the Decl had a semantic error. This
   /// allows for graceful error recovery.
   void setInvalidDecl(bool Invalid = true);
-
-  bool isInvalidDecl() const {
-    return DeclCtxWithInvalidDeclAndHasAttrs.getInt();
-  }
+  bool isInvalidDecl() const { return (bool) InvalidDecl; }
 
   /// isImplicit - Indicates whether the declaration was implicitly
   /// generated by the implementation. If false, this declaration
diff --git a/clang/lib/AST/DeclBase.cpp b/clang/lib/AST/DeclBase.cpp
index 8c83c711d882d9..66a727d9dd0c39 100644
--- a/clang/lib/AST/DeclBase.cpp
+++ b/clang/lib/AST/DeclBase.cpp
@@ -52,8 +52,6 @@
 
 using namespace clang;
 
-static_assert(sizeof(Decl) <= 32, "Decl grew beyond 32 bytes!");
-
 //===----------------------------------------------------------------------===//
 //  Statistics
 //===----------------------------------------------------------------------===//
@@ -132,7 +130,7 @@ const char *Decl::getDeclKindName() const {
 }
 
 void Decl::setInvalidDecl(bool Invalid) {
-  DeclCtxWithInvalidDeclAndHasAttrs.setInt(Invalid);
+  InvalidDecl = Invalid;
   assert(!isa<TagDecl>(this) || !cast<TagDecl>(this)->isCompleteDefinition());
   if (!Invalid) {
     return;
@@ -336,9 +334,7 @@ void PrettyStackTraceDecl::print(raw_ostream &OS) const {
 Decl::~Decl() = default;
 
 void Decl::setDeclContext(DeclContext *DC) {
-  auto InnerPtr = DeclCtxWithInvalidDeclAndHasAttrs.getPointer();
-  InnerPtr.setPointer(DC);
-  DeclCtxWithInvalidDeclAndHasAttrs.setPointer(InnerPtr);
+  DeclCtx = DC;
 }
 
 void Decl::setLexicalDeclContext(DeclContext *DC) {
@@ -368,16 +364,12 @@ void Decl::setLexicalDeclContext(DeclContext *DC) {
 void Decl::setDeclContextsImpl(DeclContext *SemaDC, DeclContext *LexicalDC,
                                ASTContext &Ctx) {
   if (SemaDC == LexicalDC) {
-    auto InnerPtr = DeclCtxWithInvalidDeclAndHasAttrs.getPointer();
-    InnerPtr.setPointer(SemaDC);
-    DeclCtxWithInvalidDeclAndHasAttrs.setPointer(InnerPtr);
+    DeclCtx = SemaDC;
   } else {
     auto *MDC = new (Ctx) Decl::MultipleDC();
     MDC->SemanticDC = SemaDC;
     MDC->LexicalDC = LexicalDC;
-    auto InnerPtr = DeclCtxWithInvalidDeclAndHasAttrs.getPointer();
-    InnerPtr.setPointer(MDC);
-    DeclCtxWithInvalidDeclAndHasAttrs.setPointer(InnerPtr);
+    DeclCtx = MDC;
   }
 }
 
@@ -964,24 +956,19 @@ unsigned Decl::getIdentifierNamespaceForKind(Kind DeclKind) {
 }
 
 void Decl::setAttrsImpl(const AttrVec &attrs, ASTContext &Ctx) {
-  assert(!hasAttrs() && "Decl already contains attrs.");
+  assert(!HasAttrs && "Decl already contains attrs.");
 
   AttrVec &AttrBlank = Ctx.getDeclAttrs(this);
   assert(AttrBlank.empty() && "HasAttrs was wrong?");
 
   AttrBlank = attrs;
-  auto InnerPtr = DeclCtxWithInvalidDeclAndHasAttrs.getPointer();
-  InnerPtr.setInt(true);
-  DeclCtxWithInvalidDeclAndHasAttrs.setPointer(InnerPtr);
+  HasAttrs = true;
 }
 
 void Decl::dropAttrs() {
-  if (!hasAttrs())
-    return;
+  if (!HasAttrs) return;
 
-  auto InnerPtr = DeclCtxWithInvalidDeclAndHasAttrs.getPointer();
-  InnerPtr.setInt(false);
-  DeclCtxWithInvalidDeclAndHasAttrs.setPointer(InnerPtr);
+  HasAttrs = false;
   getASTContext().eraseDeclAttrs(this);
 }
 
@@ -1009,7 +996,7 @@ void Decl::addAttr(Attr *A) {
 }
 
 const AttrVec &Decl::getAttrs() const {
-  assert(hasAttrs() && "No attrs to get!");
+  assert(HasAttrs && "No attrs to get!");
   return getASTContext().getDeclAttrs(this);
 }
 
diff --git a/clang/lib/Serialization/ASTReaderDecl.cpp b/clang/lib/Serialization/ASTReaderDecl.cpp
index c5dd89e1c8a4db..ff72fc30c718f8 100644
--- a/clang/lib/Serialization/ASTReaderDecl.cpp
+++ b/clang/lib/Serialization/ASTReaderDecl.cpp
@@ -588,7 +588,7 @@ void ASTDeclReader::VisitDecl(Decl *D) {
   bool HasStandaloneLexicalDC = DeclBits.getNextBit();
   bool HasAttrs = DeclBits.getNextBit();
   D->setTopLevelDeclInObjCContainer(DeclBits.getNextBit());
-  D->DeclCtxWithInvalidDeclAndHasAttrs.setInt(DeclBits.getNextBit());
+  D->InvalidDecl = DeclBits.getNextBit();
   D->FromASTFile = true;
 
   if (D->isTemplateParameter() || D->isTemplateParameterPack() ||

bazuzi pushed a commit to bazuzi/llvm-project that referenced this pull request Apr 15, 2024
…lvm#88654)

Reverts llvm#87361

On 32 bit platforms there is only a single bit available in the
`DeclCtx`, resulting in an assertion failure.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
clang:frontend Language frontend issues, e.g. anything involving "Sema" clang:modules C++20 modules and Clang Header Modules clang Clang issues not falling into any other category
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants