diff --git a/include/EGL/eglplatform.h b/include/EGL/eglplatform.h
index 543f8e5cb..bfd9bd68e 100644
--- a/include/EGL/eglplatform.h
+++ b/include/EGL/eglplatform.h
@@ -110,7 +110,7 @@ typedef void*                           EGLNativeDisplayType;
 typedef struct egl_native_pixmap_t*     EGLNativePixmapType;
 typedef struct ANativeWindow*           EGLNativeWindowType;
 
-#elif defined(USE_OZONE)
+#elif defined(USE_OZONE) || defined(USE_SYSTEM_EGL)
 
 typedef intptr_t EGLNativeDisplayType;
 typedef intptr_t EGLNativePixmapType;
diff --git a/include/GLSLANG/ShaderLang.h b/include/GLSLANG/ShaderLang.h
index c804715d2..1e5ee2979 100644
--- a/include/GLSLANG/ShaderLang.h
+++ b/include/GLSLANG/ShaderLang.h
@@ -8,7 +8,11 @@
 
 #include <stddef.h>
 
-#include "KHR/khrplatform.h"
+#if defined(__APPLE__)
+#include "khrplatform.h"
+#else
+#include "../KHR/khrplatform.h"
+#endif
 
 #include <array>
 #include <map>
diff --git a/src/common/PoolAlloc.cpp b/src/common/PoolAlloc.cpp
index b6e3702f8..e0eb53388 100644
--- a/src/common/PoolAlloc.cpp
+++ b/src/common/PoolAlloc.cpp
@@ -55,7 +55,7 @@ PoolAllocator::PoolAllocator(int growthIncrement, int allocationAlignment)
         mAlignment &= ~(minAlign - 1);
         if (mAlignment < minAlign)
             mAlignment = minAlign;
-        mAlignment     = gl::ceilPow2(mAlignment);
+        mAlignment     = gl::ceilPow2(static_cast<unsigned int>(mAlignment));
         mAlignmentMask = mAlignment - 1;
 
 #if !defined(ANGLE_DISABLE_POOL_ALLOC)
diff --git a/src/common/debug.h b/src/common/debug.h
index 64783687b..3bfafb5b9 100644
--- a/src/common/debug.h
+++ b/src/common/debug.h
@@ -248,7 +248,7 @@ std::ostream &FmtHex(std::ostream &os, T value)
 #    define EVENT(message, ...) (void(0))
 #endif
 
-#if defined(COMPILER_GCC) || defined(__clang__)
+#if defined(__GNUC__) || defined(__clang__)
 #    define ANGLE_CRASH() __builtin_trap()
 #else
 #    define ANGLE_CRASH() ((void)(*(volatile char *)0 = 0)), __assume(0)
@@ -336,7 +336,7 @@ std::ostream &FmtHex(std::ostream &os, T value)
 #    define ANGLE_ENABLE_STRUCT_PADDING_WARNINGS \
         _Pragma("clang diagnostic push") _Pragma("clang diagnostic error \"-Wpadded\"")
 #    define ANGLE_DISABLE_STRUCT_PADDING_WARNINGS _Pragma("clang diagnostic pop")
-#elif defined(COMPILER_GCC)
+#elif defined(__GNUC__)
 #    define ANGLE_ENABLE_STRUCT_PADDING_WARNINGS \
         _Pragma("GCC diagnostic push") _Pragma("GCC diagnostic error \"-Wpadded\"")
 #    define ANGLE_DISABLE_STRUCT_PADDING_WARNINGS _Pragma("GCC diagnostic pop")
diff --git a/src/common/mathutil.h b/src/common/mathutil.h
index edf63dd15..6573dd589 100644
--- a/src/common/mathutil.h
+++ b/src/common/mathutil.h
@@ -967,7 +967,7 @@ inline uint32_t BitfieldReverse(uint32_t value)
 }
 
 // Count the 1 bits.
-#if defined(_M_IX86) || defined(_M_X64)
+#if defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64))
 #    define ANGLE_HAS_BITCOUNT_32
 inline int BitCount(uint32_t bits)
 {
diff --git a/src/common/utilities.cpp b/src/common/utilities.cpp
index 84be99016..295b8f1a0 100644
--- a/src/common/utilities.cpp
+++ b/src/common/utilities.cpp
@@ -617,11 +617,16 @@ bool IsTriangleMode(PrimitiveMode drawMode)
 
 namespace priv
 {
-const angle::PackedEnumMap<PrimitiveMode, bool> gLineModes = {
-    {{PrimitiveMode::LineLoop, true},
-     {PrimitiveMode::LineStrip, true},
-     {PrimitiveMode::LineStripAdjacency, true},
-     {PrimitiveMode::Lines, true}}};
+const angle::PackedEnumMap<PrimitiveMode, bool>& gLineModes()
+{
+    static const angle::PackedEnumMap<PrimitiveMode, bool> modes {
+        { PrimitiveMode::LineLoop, true },
+        { PrimitiveMode::LineStrip, true },
+        { PrimitiveMode::LineStripAdjacency, true },
+        { PrimitiveMode::Lines, true }
+    };
+    return modes;
+};
 }  // namespace priv
 
 bool IsIntegerFormat(GLenum unsizedFormat)
diff --git a/src/common/utilities.h b/src/common/utilities.h
index 9dcb06e8a..7a1429a43 100644
--- a/src/common/utilities.h
+++ b/src/common/utilities.h
@@ -78,12 +78,12 @@ bool IsTriangleMode(PrimitiveMode drawMode);
 
 namespace priv
 {
-extern const angle::PackedEnumMap<PrimitiveMode, bool> gLineModes;
+extern const angle::PackedEnumMap<PrimitiveMode, bool>& gLineModes();
 }  // namespace priv
 
 ANGLE_INLINE bool IsLineMode(PrimitiveMode primitiveMode)
 {
-    return priv::gLineModes[primitiveMode];
+    return priv::gLineModes()[primitiveMode];
 }
 
 bool IsIntegerFormat(GLenum unsizedFormat);
diff --git a/src/compiler/preprocessor/ExpressionParser.cpp b/src/compiler/preprocessor/ExpressionParser.cpp
index 461c2145d..5da6a22d6 100644
--- a/src/compiler/preprocessor/ExpressionParser.cpp
+++ b/src/compiler/preprocessor/ExpressionParser.cpp
@@ -1,5 +1,7 @@
 /* A Bison parser, made by GNU Bison 3.0.4.  */
 
+/* Apple Note: For the avoidance of doubt, Apple elects to distribute this file under the terms of the BSD license. */
+
 /* Bison implementation for Yacc-like parsers in C
 
    Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
diff --git a/src/compiler/preprocessor/Tokenizer.cpp b/src/compiler/preprocessor/Tokenizer.cpp
index 2ce67b738..429026e98 100644
--- a/src/compiler/preprocessor/Tokenizer.cpp
+++ b/src/compiler/preprocessor/Tokenizer.cpp
@@ -700,8 +700,6 @@ IF YOU MODIFY THIS FILE YOU ALSO NEED TO RUN generate_parser.sh.
 #if defined(__clang__)
 // Flex uses `/*FALLTHROUGH*/` instead of dedicated statements.
 #    pragma GCC diagnostic ignored "-Wimplicit-fallthrough"
-// Flex isn't semi-colon clean.
-#    pragma clang diagnostic ignored "-Wextra-semi-stmt"
 #endif
 
 // Workaround for flex using the register keyword, deprecated in C++11.
diff --git a/src/compiler/preprocessor/Tokenizer.l b/src/compiler/preprocessor/Tokenizer.l
index 94db185ef..3df736713 100644
--- a/src/compiler/preprocessor/Tokenizer.l
+++ b/src/compiler/preprocessor/Tokenizer.l
@@ -41,8 +41,6 @@ IF YOU MODIFY THIS FILE YOU ALSO NEED TO RUN generate_parser.sh.
 #if defined(__clang__)
 // Flex uses `/*FALLTHROUGH*/` instead of dedicated statements.
 #pragma GCC diagnostic ignored "-Wimplicit-fallthrough"
-// Flex isn't semi-colon clean.
-#pragma clang diagnostic ignored "-Wextra-semi-stmt"
 #endif
 
 // Workaround for flex using the register keyword, deprecated in C++11.
diff --git a/src/compiler/translator/ShaderVars.cpp b/src/compiler/translator/ShaderVars.cpp
index 202ed2111..2c2592ffb 100644
--- a/src/compiler/translator/ShaderVars.cpp
+++ b/src/compiler/translator/ShaderVars.cpp
@@ -112,7 +112,7 @@ unsigned int ShaderVariable::getInnerArraySizeProduct() const
     unsigned int arraySizeProduct = 1u;
     for (size_t index = 1; index < arraySizes.size(); ++index)
     {
-        arraySizeProduct *= getNestedArraySize(index);
+        arraySizeProduct *= getNestedArraySize(static_cast<unsigned int>(index));
     }
     return arraySizeProduct;
 }
diff --git a/src/compiler/translator/TranslatorHLSL.h b/src/compiler/translator/TranslatorHLSL.h
index bb8b7f285..1a9f6167e 100644
--- a/src/compiler/translator/TranslatorHLSL.h
+++ b/src/compiler/translator/TranslatorHLSL.h
@@ -16,7 +16,9 @@ class TranslatorHLSL : public TCompiler
 {
   public:
     TranslatorHLSL(sh::GLenum type, ShShaderSpec spec, ShShaderOutput output);
+#ifdef ANGLE_ENABLE_HLSL
     TranslatorHLSL *getAsTranslatorHLSL() override { return this; }
+#endif
 
     bool hasShaderStorageBlock(const std::string &interfaceBlockName) const;
     unsigned int getShaderStorageBlockRegister(const std::string &interfaceBlockName) const;
diff --git a/src/compiler/translator/TranslatorVulkan.cpp b/src/compiler/translator/TranslatorVulkan.cpp
index 19b6847e4..1c4ea950c 100644
--- a/src/compiler/translator/TranslatorVulkan.cpp
+++ b/src/compiler/translator/TranslatorVulkan.cpp
@@ -195,7 +195,7 @@ TIntermBinary *CreateDriverUniformRef(const TVariable *driverUniforms, const cha
 
     TIntermSymbol *angleUniformsRef = new TIntermSymbol(driverUniforms);
     TConstantUnion *uniformIndex    = new TConstantUnion;
-    uniformIndex->setIConst(fieldIndex);
+    uniformIndex->setIConst(static_cast<int>(fieldIndex));
     TIntermConstantUnion *indexRef =
         new TIntermConstantUnion(uniformIndex, *StaticType::GetBasic<EbtInt>());
     return new TIntermBinary(EOpIndexDirectInterfaceBlock, angleUniformsRef, indexRef);
diff --git a/src/compiler/translator/blocklayout.cpp b/src/compiler/translator/blocklayout.cpp
index 7d0609ec8..898be505f 100644
--- a/src/compiler/translator/blocklayout.cpp
+++ b/src/compiler/translator/blocklayout.cpp
@@ -258,18 +258,18 @@ void Std140BlockEncoder::getBlockLayoutInfo(GLenum type,
     if (gl::IsMatrixType(type))
     {
         baseAlignment = getTypeBaseAlignment(type, isRowMajorMatrix);
-        matrixStride  = getTypeBaseAlignment(type, isRowMajorMatrix);
+        matrixStride  = static_cast<int>(getTypeBaseAlignment(type, isRowMajorMatrix));
 
         if (!arraySizes.empty())
         {
             const int numRegisters = gl::MatrixRegisterCount(type, isRowMajorMatrix);
-            arrayStride            = getTypeBaseAlignment(type, isRowMajorMatrix) * numRegisters;
+            arrayStride            = static_cast<int>(getTypeBaseAlignment(type, isRowMajorMatrix) * numRegisters);
         }
     }
     else if (!arraySizes.empty())
     {
-        baseAlignment = getTypeBaseAlignment(type, false);
-        arrayStride   = getTypeBaseAlignment(type, false);
+        baseAlignment = static_cast<int>(getTypeBaseAlignment(type, false));
+        arrayStride   = static_cast<int>(getTypeBaseAlignment(type, false));
     }
     else
     {
diff --git a/src/compiler/translator/glslang.l b/src/compiler/translator/glslang.l
index 8af29a8a7..c6aa91d52 100644
--- a/src/compiler/translator/glslang.l
+++ b/src/compiler/translator/glslang.l
@@ -40,8 +40,6 @@ WHICH GENERATES THE GLSL ES LEXER (glslang_lex.cpp).
 #endif
 #if defined(__clang__)
 #pragma GCC diagnostic ignored "-Wimplicit-fallthrough"
-// Flex isn't semi-colon clean.
-#pragma clang diagnostic ignored "-Wextra-semi-stmt"
 #endif
 }
 
diff --git a/src/compiler/translator/glslang_lex.cpp b/src/compiler/translator/glslang_lex.cpp
index 2bf0ab37b..f35e05ada 100644
--- a/src/compiler/translator/glslang_lex.cpp
+++ b/src/compiler/translator/glslang_lex.cpp
@@ -25,8 +25,6 @@
 #endif
 #if defined(__clang__)
 #pragma GCC diagnostic ignored "-Wimplicit-fallthrough"
-// Flex isn't semi-colon clean.
-#pragma clang diagnostic ignored "-Wextra-semi-stmt"
 #endif
 
 
diff --git a/src/compiler/translator/glslang_tab.cpp b/src/compiler/translator/glslang_tab.cpp
index a60203b85..56c7fbd9b 100644
--- a/src/compiler/translator/glslang_tab.cpp
+++ b/src/compiler/translator/glslang_tab.cpp
@@ -1,5 +1,7 @@
 /* A Bison parser, made by GNU Bison 3.0.4.  */
 
+/* Apple Note: For the avoidance of doubt, Apple elects to distribute this file under the terms of the BSD license. */
+
 /* Bison implementation for Yacc-like parsers in C
 
    Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
diff --git a/src/compiler/translator/glslang_tab.h b/src/compiler/translator/glslang_tab.h
index e05076fcb..19be0f89d 100644
--- a/src/compiler/translator/glslang_tab.h
+++ b/src/compiler/translator/glslang_tab.h
@@ -1,5 +1,7 @@
 /* A Bison parser, made by GNU Bison 3.0.4.  */
 
+/* Apple Note: For the avoidance of doubt, Apple elects to distribute this file under the terms of the BSD license. */
+
 /* Bison interface for Yacc-like parsers in C
 
    Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
diff --git a/src/libANGLE/Image.cpp b/src/libANGLE/Image.cpp
index d94d311a9..3c077c365 100644
--- a/src/libANGLE/Image.cpp
+++ b/src/libANGLE/Image.cpp
@@ -162,7 +162,7 @@ gl::Format ExternalImageSibling::getAttachmentFormat(GLenum binding,
 
 GLsizei ExternalImageSibling::getAttachmentSamples(const gl::ImageIndex &imageIndex) const
 {
-    return mImplementation->getSamples();
+    return static_cast<GLsizei>(mImplementation->getSamples());
 }
 
 bool ExternalImageSibling::isRenderable(const gl::Context *context,
diff --git a/src/libANGLE/MemoryProgramCache.cpp b/src/libANGLE/MemoryProgramCache.cpp
index 9c549220a..0fc080521 100644
--- a/src/libANGLE/MemoryProgramCache.cpp
+++ b/src/libANGLE/MemoryProgramCache.cpp
@@ -134,7 +134,7 @@ angle::Result MemoryProgramCache::getProgram(const Context *context,
     if (get(context, *hashOut, &binaryProgram))
     {
         angle::Result result = program->loadBinary(context, GL_PROGRAM_BINARY_ANGLE,
-                                                   binaryProgram.data(), binaryProgram.size());
+                                                   binaryProgram.data(), static_cast<int>(binaryProgram.size()));
         ANGLE_HISTOGRAM_BOOLEAN("GPU.ANGLE.ProgramCache.LoadBinarySuccess",
                                 result == angle::Result::Continue);
         ANGLE_TRY(result);
diff --git a/src/libANGLE/Platform.cpp b/src/libANGLE/Platform.cpp
index 6cbbd1e80..e987ff0eb 100644
--- a/src/libANGLE/Platform.cpp
+++ b/src/libANGLE/Platform.cpp
@@ -15,12 +15,17 @@
 namespace
 {
 // TODO(jmadill): Make methods owned by egl::Display.
-angle::PlatformMethods g_platformMethods;
+angle::PlatformMethods& g_platformMethods()
+{
+    static angle::PlatformMethods platformMethods;
+    return platformMethods;
+}
+
 }  // anonymous namespace
 
 angle::PlatformMethods *ANGLEPlatformCurrent()
 {
-    return &g_platformMethods;
+    return &g_platformMethods();
 }
 
 bool ANGLE_APIENTRY ANGLEGetDisplayPlatform(angle::EGLDisplayType display,
@@ -53,13 +58,13 @@ bool ANGLE_APIENTRY ANGLEGetDisplayPlatform(angle::EGLDisplayType display,
     }
 
     // TODO(jmadill): Store platform methods in display.
-    g_platformMethods.context = context;
-    *platformMethodsOut       = &g_platformMethods;
+    g_platformMethods().context = context;
+    *platformMethodsOut       = &g_platformMethods();
     return true;
 }
 
 void ANGLE_APIENTRY ANGLEResetDisplayPlatform(angle::EGLDisplayType display)
 {
     // TODO(jmadill): Store platform methods in display.
-    g_platformMethods = angle::PlatformMethods();
+    g_platformMethods() = angle::PlatformMethods();
 }
diff --git a/src/libANGLE/State.cpp b/src/libANGLE/State.cpp
index 7223bb9de..9e47bda44 100644
--- a/src/libANGLE/State.cpp
+++ b/src/libANGLE/State.cpp
@@ -216,20 +216,24 @@ void State::setGenericBufferBinding<BufferBinding::ElementArray>(const Context *
     mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
 }
 
-const angle::PackedEnumMap<BufferBinding, State::BufferBindingSetter> State::kBufferSetters = {{
-    GetBufferBindingSetter<BufferBinding::Array>(),
-    GetBufferBindingSetter<BufferBinding::AtomicCounter>(),
-    GetBufferBindingSetter<BufferBinding::CopyRead>(),
-    GetBufferBindingSetter<BufferBinding::CopyWrite>(),
-    GetBufferBindingSetter<BufferBinding::DispatchIndirect>(),
-    GetBufferBindingSetter<BufferBinding::DrawIndirect>(),
-    GetBufferBindingSetter<BufferBinding::ElementArray>(),
-    GetBufferBindingSetter<BufferBinding::PixelPack>(),
-    GetBufferBindingSetter<BufferBinding::PixelUnpack>(),
-    GetBufferBindingSetter<BufferBinding::ShaderStorage>(),
-    GetBufferBindingSetter<BufferBinding::TransformFeedback>(),
-    GetBufferBindingSetter<BufferBinding::Uniform>(),
-}};
+const angle::PackedEnumMap<BufferBinding, State::BufferBindingSetter>& State::kBufferSetters()
+{
+    static const angle::PackedEnumMap<BufferBinding, State::BufferBindingSetter> setters {{
+        GetBufferBindingSetter<BufferBinding::Array>(),
+        GetBufferBindingSetter<BufferBinding::AtomicCounter>(),
+        GetBufferBindingSetter<BufferBinding::CopyRead>(),
+        GetBufferBindingSetter<BufferBinding::CopyWrite>(),
+        GetBufferBindingSetter<BufferBinding::DispatchIndirect>(),
+        GetBufferBindingSetter<BufferBinding::DrawIndirect>(),
+        GetBufferBindingSetter<BufferBinding::ElementArray>(),
+        GetBufferBindingSetter<BufferBinding::PixelPack>(),
+        GetBufferBindingSetter<BufferBinding::PixelUnpack>(),
+        GetBufferBindingSetter<BufferBinding::ShaderStorage>(),
+        GetBufferBindingSetter<BufferBinding::TransformFeedback>(),
+        GetBufferBindingSetter<BufferBinding::Uniform>(),
+    }};
+    return setters;
+}
 
 State::State(ContextID contextIn,
              const State *shareContextState,
@@ -1214,7 +1218,7 @@ void State::detachSampler(const Context *context, GLuint sampler)
     {
         if (mSamplers[i].id() == sampler)
         {
-            setSamplerBinding(context, i, nullptr);
+            setSamplerBinding(context, static_cast<GLuint>(i), nullptr);
         }
     }
 }
diff --git a/src/libANGLE/State.h b/src/libANGLE/State.h
index bec9a5e09..5a49431f3 100644
--- a/src/libANGLE/State.h
+++ b/src/libANGLE/State.h
@@ -318,7 +318,7 @@ class State : angle::NonCopyable
     //// Typed buffer binding point manipulation ////
     ANGLE_INLINE void setBufferBinding(const Context *context, BufferBinding target, Buffer *buffer)
     {
-        (this->*(kBufferSetters[target]))(context, buffer);
+        (this->*(kBufferSetters()[target]))(context, buffer);
     }
 
     ANGLE_INLINE Buffer *getTargetBuffer(BufferBinding target) const
@@ -693,7 +693,7 @@ class State : angle::NonCopyable
     static_assert(DIRTY_OBJECT_MAX == 9, "check DIRTY_OBJECT_MAX");
 
     // Dispatch table for buffer update functions.
-    static const angle::PackedEnumMap<BufferBinding, BufferBindingSetter> kBufferSetters;
+    static const angle::PackedEnumMap<BufferBinding, BufferBindingSetter>& kBufferSetters();
 
     Version mClientVersion;
     ContextID mContext;
diff --git a/src/libANGLE/VertexArray.cpp b/src/libANGLE/VertexArray.cpp
index f14876668..56a783f8a 100644
--- a/src/libANGLE/VertexArray.cpp
+++ b/src/libANGLE/VertexArray.cpp
@@ -193,7 +193,7 @@ bool VertexArray::detachBuffer(const Context *context, GLuint bufferName)
             }
             else
             {
-                ASSERT(binding.getBoundAttributesMask() == AttributesMask(1ull << bindingIndex));
+                ASSERT(binding.getBoundAttributesMask() == AttributesMask(1u << bindingIndex));
                 setDirtyAttribBit(bindingIndex, DIRTY_ATTRIB_POINTER);
             }
 
diff --git a/src/libANGLE/renderer/gl/ProgramGL.cpp b/src/libANGLE/renderer/gl/ProgramGL.cpp
index e819ba8df..996aa7e1e 100644
--- a/src/libANGLE/renderer/gl/ProgramGL.cpp
+++ b/src/libANGLE/renderer/gl/ProgramGL.cpp
@@ -364,7 +364,7 @@ std::unique_ptr<LinkEvent> ProgramGL::link(const gl::Context *context,
                             // set either.
                             ASSERT(outputVar.index == -1);
                             mFunctions->bindFragDataLocationIndexed(
-                                mProgramID, outputLocationIndex, 0, outputVar.mappedName.c_str());
+                                mProgramID, static_cast<int>(outputLocationIndex), 0, outputVar.mappedName.c_str());
                         }
                     }
                 }
@@ -386,7 +386,7 @@ std::unique_ptr<LinkEvent> ProgramGL::link(const gl::Context *context,
                             // the index set either.
                             ASSERT(outputVar.index == -1);
                             mFunctions->bindFragDataLocationIndexed(
-                                mProgramID, outputLocationIndex, 1, outputVar.mappedName.c_str());
+                                mProgramID, static_cast<int>(outputLocationIndex), 1, outputVar.mappedName.c_str());
                         }
                     }
                 }
diff --git a/src/libANGLE/validationES3.cpp b/src/libANGLE/validationES3.cpp
index 1acb57843..94db8b545 100644
--- a/src/libANGLE/validationES3.cpp
+++ b/src/libANGLE/validationES3.cpp
@@ -4166,7 +4166,7 @@ bool ValidateBindFragDataLocationIndexedEXT(Context *context,
         context->validationError(GL_INVALID_OPERATION, kES3Required);
         return false;
     }
-    if (index < 0 || index > 1)
+    if (index > 1)
     {
         // This error is not explicitly specified but the spec does say that "<index> may be zero or
         // one to specify that the color be used as either the first or second color input to the
diff --git a/src/tests/compiler_tests/QualificationOrder_test.cpp b/src/tests/compiler_tests/QualificationOrder_test.cpp
index c0249dbb9..f8b1c5fdc 100644
--- a/src/tests/compiler_tests/QualificationOrder_test.cpp
+++ b/src/tests/compiler_tests/QualificationOrder_test.cpp
@@ -429,7 +429,7 @@ TEST_F(QualificationOrderFragmentShaderTest, InvalidFunctionParametersInvariant)
         "}\n"
         "void main()\n"
         "{\n"
-        "	gl_FragColor = vec4(foo0(value));\n"
+        "    gl_FragColor = vec4(foo0(value));\n"
         "}\n";
 
     if (compile(shaderString))
@@ -449,7 +449,7 @@ TEST_F(QualificationOrderFragmentShaderTest, InvalidFunctionParametersAttribute)
         "}\n"
         "void main()\n"
         "{\n"
-        "	gl_FragColor = vec4(foo0(value));\n"
+        "    gl_FragColor = vec4(foo0(value));\n"
         "}\n";
 
     if (compile(shaderString))
@@ -469,7 +469,7 @@ TEST_F(QualificationOrderFragmentShaderTest, InvalidFunctionParametersVarying)
         "}\n"
         "void main()\n"
         "{\n"
-        "	gl_FragColor = vec4(foo0(value));\n"
+        "    gl_FragColor = vec4(foo0(value));\n"
         "}\n";
 
     if (compile(shaderString))
@@ -491,7 +491,7 @@ TEST_F(QualificationOrderFragmentShaderTest, InvalidFunctionParametersLayout)
         "out vec4 colorOUT;\n"
         "void main()\n"
         "{\n"
-        "	colorOUT = vec4(foo0(value));\n"
+        "    colorOUT = vec4(foo0(value));\n"
         "}\n";
 
     if (compile(shaderString))
@@ -513,7 +513,7 @@ TEST_F(QualificationOrderFragmentShaderTest, InvalidFunctionParametersCentroidIn
         "out vec4 colorOUT;\n"
         "void main()\n"
         "{\n"
-        "	colorOUT = vec4(foo0(value));\n"
+        "    colorOUT = vec4(foo0(value));\n"
         "}\n";
 
     if (compile(shaderString))
@@ -535,7 +535,7 @@ TEST_F(QualificationOrderFragmentShaderTest, InvalidFunctionParametersFlatIn)
         "out vec4 colorOUT;\n"
         "void main()\n"
         "{\n"
-        "	colorOUT = vec4(foo0(value));\n"
+        "    colorOUT = vec4(foo0(value));\n"
         "}\n";
 
     if (compile(shaderString))
diff --git a/src/tests/perf_tests/MultiviewPerf.cpp b/src/tests/perf_tests/MultiviewPerf.cpp
index df6408d02..9144dfa36 100644
--- a/src/tests/perf_tests/MultiviewPerf.cpp
+++ b/src/tests/perf_tests/MultiviewPerf.cpp
@@ -276,7 +276,7 @@ void MultiviewCPUBoundBenchmark::initializeBenchmark()
         "{\n"
         "   vec4 v = vPosition;\n"
         "   v.xy += uOffset;\n"
-        "	gl_Position = v;\n"
+        "   gl_Position = v;\n"
         "}\n";
 
     const std::string fs =
@@ -374,7 +374,7 @@ void MultiviewGPUBoundBenchmark::initializeBenchmark()
         "   frag_Col3 = vert_Col3;\n"
         "   frag_Col4 = vert_Col4;\n"
         "   frag_Col5 = vert_Col5;\n"
-        "	gl_Position = vPosition;\n"
+        "   gl_Position = vPosition;\n"
         "}\n";
 
     const std::string &fs =
