[clang] Fix compilation with GCC < 8 for MinGW
authorMartin Storsjö <martin@martin.st>
Wed, 18 Dec 2019 08:41:41 +0000 (10:41 +0200)
committerMartin Storsjö <martin@martin.st>
Thu, 19 Dec 2019 10:14:09 +0000 (12:14 +0200)
GCC 7 and earlier, when targeting MinGW, seems to have a bug in
layout/size of bitfield structs if they contain a nested enum,
making the size of the struct 8 bytes, while we have a static assert
requiring it to be 4 bytes or less.

While this clearly is a GCC bug, the workaround (moving the enum out
of the bitfield) also is very nonintrusive and matches other existing
enums there.

Differential Revision: https://reviews.llvm.org/D71650

clang/include/clang/AST/Decl.h

index de1cfe9..a733553 100644 (file)
@@ -873,6 +873,8 @@ protected:
     DAK_Normal
   };
 
+  enum { NumScopeDepthOrObjCQualsBits = 7 };
+
   class ParmVarDeclBitfields {
     friend class ASTDeclReader;
     friend class ParmVarDecl;
@@ -895,8 +897,6 @@ protected:
     /// Whether this parameter is an ObjC method parameter or not.
     unsigned IsObjCMethodParam : 1;
 
-    enum { NumScopeDepthOrObjCQualsBits = 7 };
-
     /// If IsObjCMethodParam, a Decl::ObjCDeclQualifier.
     /// Otherwise, the number of function parameter scopes enclosing
     /// the function parameter scope in which this parameter was
@@ -1627,7 +1627,7 @@ public:
   }
 
   static constexpr unsigned getMaxFunctionScopeDepth() {
-    return (1u << ParmVarDeclBitfields::NumScopeDepthOrObjCQualsBits) - 1;
+    return (1u << NumScopeDepthOrObjCQualsBits) - 1;
   }
 
   /// Returns the index of this parameter in its prototype or method scope.