Work around unsuppressable GCC error.

GCC warns against bitfields not fitting the entire range of an enum
with a fixed underlying type of unsigned int, which gets promoted to
an error with -Werror and cannot be suppressed. However, GCC already
defaults to using unsigned int as the underlying type of an unscoped
enum without a fixed underlying type. So we can just omit it.

Bug chromium:697528

Change-Id: I8db8fef09e3397d4ec5ebe9f7c3c5e4ae9c0edff
Reviewed-on: https://swiftshader-review.googlesource.com/8928
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
Tested-by: Nicolas Capens <capn@google.com>
diff --git a/src/Common/Types.hpp b/src/Common/Types.hpp
index 5675ccb..cd08ed5 100644
--- a/src/Common/Types.hpp
+++ b/src/Common/Types.hpp
@@ -15,6 +15,18 @@
 #ifndef sw_Types_hpp
 #define sw_Types_hpp
 
+#include <limits>
+#include <type_traits>
+
+// GCC warns against bitfields not fitting the entire range of an enum with a fixed underlying type of unsigned int, which gets promoted to an error with -Werror and cannot be suppressed.
+// However, GCC already defaults to using unsigned int as the underlying type of an unscoped enum without a fixed underlying type. So we can just omit it.
+#if defined(__GNUC__) && !defined(__clang__)
+namespace {enum E {}; static_assert(!std::numeric_limits<std::underlying_type<E>::type>::is_signed, "expected unscoped enum whose underlying type is not fixed to be unsigned");}
+#define ENUM_UNDERLYING_TYPE_UNSIGNED_INT
+#else
+#define ENUM_UNDERLYING_TYPE_UNSIGNED_INT : unsigned int
+#endif
+
 #if defined(_MSC_VER)
 	typedef signed __int8 int8_t;
 	typedef signed __int16 int16_t;
diff --git a/src/Renderer/Context.hpp b/src/Renderer/Context.hpp
index f1e59ba..2f363f9 100644
--- a/src/Renderer/Context.hpp
+++ b/src/Renderer/Context.hpp
@@ -20,6 +20,7 @@
 #include "Stream.hpp"
 #include "Point.hpp"
 #include "Vertex.hpp"
+#include "Common/Types.hpp"
 
 namespace sw
 {
@@ -52,7 +53,7 @@
 		PositionT = 15
 	};
 
-	enum DrawType : unsigned int
+	enum DrawType ENUM_UNDERLYING_TYPE_UNSIGNED_INT
 	{
 		// These types must stay ordered by vertices per primitive. Also, if these basic types
 		// are modified, verify the value assigned to task->verticesPerPrimitive in Renderer.cpp
@@ -97,7 +98,7 @@
 		DRAW_LAST = DRAW_INDEXEDTRIANGLEFAN32
 	};
 
-	enum FillMode : unsigned int
+	enum FillMode ENUM_UNDERLYING_TYPE_UNSIGNED_INT
 	{
 		FILL_SOLID,
 		FILL_WIREFRAME,
@@ -106,7 +107,7 @@
 		FILL_LAST = FILL_VERTEX
 	};
 
-	enum ShadingMode : unsigned int
+	enum ShadingMode ENUM_UNDERLYING_TYPE_UNSIGNED_INT
 	{
 		SHADING_FLAT,
 		SHADING_GOURAUD,
@@ -114,7 +115,7 @@
 		SHADING_LAST = SHADING_GOURAUD
 	};
 
-	enum DepthCompareMode : unsigned int
+	enum DepthCompareMode ENUM_UNDERLYING_TYPE_UNSIGNED_INT
 	{
 		DEPTH_ALWAYS,
 		DEPTH_NEVER,
@@ -128,7 +129,7 @@
 		DEPTH_LAST = DEPTH_GREATEREQUAL
 	};
 
-	enum StencilCompareMode : unsigned int
+	enum StencilCompareMode ENUM_UNDERLYING_TYPE_UNSIGNED_INT
 	{
 		STENCIL_ALWAYS,
 		STENCIL_NEVER,
@@ -142,7 +143,7 @@
 		STENCIL_LAST = STENCIL_GREATEREQUAL
 	};
 
-	enum StencilOperation : unsigned int
+	enum StencilOperation ENUM_UNDERLYING_TYPE_UNSIGNED_INT
 	{
 		OPERATION_KEEP,
 		OPERATION_ZERO,
@@ -156,7 +157,7 @@
 		OPERATION_LAST = OPERATION_DECR
 	};
 
-	enum AlphaCompareMode : unsigned int
+	enum AlphaCompareMode ENUM_UNDERLYING_TYPE_UNSIGNED_INT
 	{
 		ALPHA_ALWAYS,
 		ALPHA_NEVER,
@@ -170,7 +171,7 @@
 		ALPHA_LAST = ALPHA_GREATEREQUAL
 	};
 
-	enum CullMode : unsigned int
+	enum CullMode ENUM_UNDERLYING_TYPE_UNSIGNED_INT
 	{
 		CULL_NONE,
 		CULL_CLOCKWISE,
@@ -179,7 +180,7 @@
 		CULL_LAST = CULL_COUNTERCLOCKWISE
 	};
 
-	enum BlendFactor : unsigned int
+	enum BlendFactor ENUM_UNDERLYING_TYPE_UNSIGNED_INT
 	{
 		BLEND_ZERO,
 		BLEND_ONE,
@@ -200,7 +201,7 @@
 		BLEND_LAST = BLEND_INVCONSTANT
 	};
 
-	enum BlendOperation : unsigned int
+	enum BlendOperation ENUM_UNDERLYING_TYPE_UNSIGNED_INT
 	{
 		BLENDOP_ADD,
 		BLENDOP_SUB,
@@ -215,7 +216,7 @@
 		BLENDOP_LAST = BLENDOP_NULL
 	};
 
-	enum LogicalOperation : unsigned int
+	enum LogicalOperation ENUM_UNDERLYING_TYPE_UNSIGNED_INT
 	{
 		LOGICALOP_CLEAR,
 		LOGICALOP_SET,
@@ -237,7 +238,7 @@
 		LOGICALOP_LAST = LOGICALOP_OR_INVERTED
 	};
 
-	enum MaterialSource : unsigned int
+	enum MaterialSource ENUM_UNDERLYING_TYPE_UNSIGNED_INT
 	{
 		MATERIAL_MATERIAL,
 		MATERIAL_COLOR1,
@@ -246,7 +247,7 @@
 		MATERIAL_LAST = MATERIAL_COLOR2
 	};
 
-	enum FogMode : unsigned int
+	enum FogMode ENUM_UNDERLYING_TYPE_UNSIGNED_INT
 	{
 		FOG_NONE,
 		FOG_LINEAR,
@@ -256,7 +257,7 @@
 		FOG_LAST = FOG_EXP2
 	};
 
-	enum TexGen : unsigned int
+	enum TexGen ENUM_UNDERLYING_TYPE_UNSIGNED_INT
 	{
 		TEXGEN_PASSTHRU,
 		TEXGEN_NORMAL,
@@ -268,7 +269,7 @@
 		TEXGEN_LAST = TEXGEN_NONE
 	};
 
-	enum TransparencyAntialiasing : unsigned int
+	enum TransparencyAntialiasing ENUM_UNDERLYING_TYPE_UNSIGNED_INT
 	{
 		TRANSPARENCY_NONE,
 		TRANSPARENCY_ALPHA_TO_COVERAGE,
diff --git a/src/Renderer/Sampler.hpp b/src/Renderer/Sampler.hpp
index 87c9d3f..4c4973d 100644
--- a/src/Renderer/Sampler.hpp
+++ b/src/Renderer/Sampler.hpp
@@ -17,6 +17,7 @@
 
 #include "Main/Config.hpp"
 #include "Renderer/Surface.hpp"
+#include "Common/Types.hpp"
 
 namespace sw
 {
@@ -63,7 +64,7 @@
 		SAMPLER_VERTEX
 	};
 
-	enum TextureType : unsigned int
+	enum TextureType ENUM_UNDERLYING_TYPE_UNSIGNED_INT
 	{
 		TEXTURE_NULL,
 		TEXTURE_2D,
@@ -74,7 +75,7 @@
 		TEXTURE_LAST = TEXTURE_2D_ARRAY
 	};
 
-	enum FilterType : unsigned int
+	enum FilterType ENUM_UNDERLYING_TYPE_UNSIGNED_INT
 	{
 		FILTER_POINT,
 		FILTER_GATHER,
@@ -86,7 +87,7 @@
 		FILTER_LAST = FILTER_ANISOTROPIC
 	};
 
-	enum MipmapType : unsigned int
+	enum MipmapType ENUM_UNDERLYING_TYPE_UNSIGNED_INT
 	{
 		MIPMAP_NONE,
 		MIPMAP_POINT,
@@ -95,7 +96,7 @@
 		MIPMAP_LAST = MIPMAP_LINEAR
 	};
 
-	enum AddressingMode : unsigned int
+	enum AddressingMode ENUM_UNDERLYING_TYPE_UNSIGNED_INT
 	{
 		ADDRESSING_WRAP,
 		ADDRESSING_CLAMP,
@@ -108,7 +109,7 @@
 		ADDRESSING_LAST = ADDRESSING_TEXELFETCH
 	};
 
-	enum SwizzleType : unsigned int
+	enum SwizzleType ENUM_UNDERLYING_TYPE_UNSIGNED_INT
 	{
 		SWIZZLE_RED,
 		SWIZZLE_GREEN,
diff --git a/src/Renderer/Stream.hpp b/src/Renderer/Stream.hpp
index 047cf75..88c0840 100644
--- a/src/Renderer/Stream.hpp
+++ b/src/Renderer/Stream.hpp
@@ -21,7 +21,7 @@
 {
 	class Resource;
 
-	enum StreamType : unsigned int
+	enum StreamType ENUM_UNDERLYING_TYPE_UNSIGNED_INT
 	{
 		STREAMTYPE_COLOR,     // 4 normalized unsigned bytes, ZYXW order
 		STREAMTYPE_UDEC3,     // 3 unsigned 10-bit fields