Enable -Wimplicit-fallthrough for ANGLE.

Also teach MSVC that ANGLE_CRASH() can't return.

Also fix instances of the warning in build configurations where
UNREACHABLE() can return (e.g. release without dcheck_always_on
or debug).

If the UNREACHABLE()s are truly unreachable, this change has
no behavior change.

Bug:  chromium:810767

Change-Id: I68f3587cf3e268c3ef634dce7ae3d70399859d0f
Reviewed-on: https://chromium-review.googlesource.com/914842
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Nico Weber <thakis@chromium.org>
Commit-Queue: Nico Weber <thakis@chromium.org>
diff --git a/src/compiler/translator/ParseContext.cpp b/src/compiler/translator/ParseContext.cpp
index 1d069a4..ecab1fc 100644
--- a/src/compiler/translator/ParseContext.cpp
+++ b/src/compiler/translator/ParseContext.cpp
@@ -4993,10 +4993,9 @@
             case EOpIndexDirect:
             case EOpIndexIndirect:
                 break;
-            case EOpIndexDirectStruct:
-                UNREACHABLE();
 
             default:
+                ASSERT(op != EOpIndexDirectStruct);
                 error(loc, "Invalid operation for variables with an opaque type",
                       GetOperatorString(op));
                 return false;
diff --git a/src/compiler/translator/UtilsHLSL.cpp b/src/compiler/translator/UtilsHLSL.cpp
index f21598e..88f6d34 100644
--- a/src/compiler/translator/UtilsHLSL.cpp
+++ b/src/compiler/translator/UtilsHLSL.cpp
@@ -96,6 +96,9 @@
                     return HLSL_TEXTURE_2D_SNORM;
                 default:
                     UNREACHABLE();
+#if !UNREACHABLE_IS_NORETURN
+                    return HLSL_TEXTURE_UNKNOWN;
+#endif
             }
         }
         case EbtIImage2D:
@@ -109,6 +112,9 @@
                     return HLSL_TEXTURE_2D_INT4;
                 default:
                     UNREACHABLE();
+#if !UNREACHABLE_IS_NORETURN
+                    return HLSL_TEXTURE_UNKNOWN;
+#endif
             }
         }
         case EbtUImage2D:
@@ -123,6 +129,9 @@
                     return HLSL_TEXTURE_2D_UINT4;
                 default:
                     UNREACHABLE();
+#if !UNREACHABLE_IS_NORETURN
+                    return HLSL_TEXTURE_UNKNOWN;
+#endif
             }
         }
         case EbtImage3D:
@@ -139,6 +148,9 @@
                     return HLSL_TEXTURE_3D_SNORM;
                 default:
                     UNREACHABLE();
+#if !UNREACHABLE_IS_NORETURN
+                    return HLSL_TEXTURE_UNKNOWN;
+#endif
             }
         }
         case EbtIImage3D:
@@ -152,6 +164,9 @@
                     return HLSL_TEXTURE_3D_INT4;
                 default:
                     UNREACHABLE();
+#if !UNREACHABLE_IS_NORETURN
+                    return HLSL_TEXTURE_UNKNOWN;
+#endif
             }
         }
         case EbtUImage3D:
@@ -165,6 +180,9 @@
                     return HLSL_TEXTURE_3D_UINT4;
                 default:
                     UNREACHABLE();
+#if !UNREACHABLE_IS_NORETURN
+                    return HLSL_TEXTURE_UNKNOWN;
+#endif
             }
         }
         case EbtImage2DArray:
@@ -182,6 +200,9 @@
                     return HLSL_TEXTURE_2D_ARRAY_SNORM;
                 default:
                     UNREACHABLE();
+#if !UNREACHABLE_IS_NORETURN
+                    return HLSL_TEXTURE_UNKNOWN;
+#endif
             }
         }
         case EbtIImage2DArray:
@@ -196,6 +217,9 @@
                     return HLSL_TEXTURE_2D_ARRAY_INT4;
                 default:
                     UNREACHABLE();
+#if !UNREACHABLE_IS_NORETURN
+                    return HLSL_TEXTURE_UNKNOWN;
+#endif
             }
         }
         case EbtUImage2DArray:
@@ -210,12 +234,17 @@
                     return HLSL_TEXTURE_2D_ARRAY_UINT4;
                 default:
                     UNREACHABLE();
+#if !UNREACHABLE_IS_NORETURN
+                    return HLSL_TEXTURE_UNKNOWN;
+#endif
             }
         }
         default:
             UNREACHABLE();
+#if !UNREACHABLE_IS_NORETURN
+            return HLSL_TEXTURE_UNKNOWN;
+#endif
     }
-    return HLSL_TEXTURE_UNKNOWN;
 }
 
 const char *TextureString(const HLSLTextureGroup textureGroup)
@@ -372,6 +401,9 @@
                 default:
                     UNREACHABLE();
             }
+#if !UNREACHABLE_IS_NORETURN
+            break;
+#endif
         }
         case EbtIImageCube:
         {
@@ -385,6 +417,9 @@
                 default:
                     UNREACHABLE();
             }
+#if !UNREACHABLE_IS_NORETURN
+            break;
+#endif
         }
         case EbtUImageCube:
         {
@@ -398,11 +433,18 @@
                 default:
                     UNREACHABLE();
             }
+#if !UNREACHABLE_IS_NORETURN
+            break;
+#endif
         }
         default:
             // All other types are identified by their group suffix
             return TextureGroupSuffix(type, imageInternalFormat);
     }
+#if !UNREACHABLE_IS_NORETURN
+    UNREACHABLE();
+    return "_TTS_invalid_";
+#endif
 }
 
 HLSLRWTextureGroup RWTextureGroup(const TBasicType type,
@@ -426,6 +468,9 @@
                 default:
                     UNREACHABLE();
             }
+#if !UNREACHABLE_IS_NORETURN
+            break;
+#endif
         }
         case EbtIImage2D:
         {
@@ -439,6 +484,9 @@
                 default:
                     UNREACHABLE();
             }
+#if !UNREACHABLE_IS_NORETURN
+            break;
+#endif
         }
         case EbtUImage2D:
         {
@@ -453,6 +501,9 @@
                 default:
                     UNREACHABLE();
             }
+#if !UNREACHABLE_IS_NORETURN
+            break;
+#endif
         }
         case EbtImage3D:
         {
@@ -469,6 +520,9 @@
                 default:
                     UNREACHABLE();
             }
+#if !UNREACHABLE_IS_NORETURN
+            break;
+#endif
         }
         case EbtIImage3D:
         {
@@ -482,6 +536,9 @@
                 default:
                     UNREACHABLE();
             }
+#if !UNREACHABLE_IS_NORETURN
+            break;
+#endif
         }
         case EbtUImage3D:
         {
@@ -495,6 +552,9 @@
                 default:
                     UNREACHABLE();
             }
+#if !UNREACHABLE_IS_NORETURN
+            break;
+#endif
         }
         case EbtImage2DArray:
         case EbtImageCube:
@@ -512,6 +572,9 @@
                 default:
                     UNREACHABLE();
             }
+#if !UNREACHABLE_IS_NORETURN
+            break;
+#endif
         }
         case EbtIImage2DArray:
         case EbtIImageCube:
@@ -526,6 +589,9 @@
                 default:
                     UNREACHABLE();
             }
+#if !UNREACHABLE_IS_NORETURN
+            break;
+#endif
         }
         case EbtUImage2DArray:
         case EbtUImageCube:
@@ -540,6 +606,9 @@
                 default:
                     UNREACHABLE();
             }
+#if !UNREACHABLE_IS_NORETURN
+            break;
+#endif
         }
         default:
             UNREACHABLE();
@@ -660,6 +729,9 @@
                 default:
                     UNREACHABLE();
             }
+#if !UNREACHABLE_IS_NORETURN
+            break;
+#endif
         }
         case EbtIImageCube:
         {
@@ -673,6 +745,9 @@
                 default:
                     UNREACHABLE();
             }
+#if !UNREACHABLE_IS_NORETURN
+            break;
+#endif
         }
         case EbtUImageCube:
         {
@@ -686,11 +761,18 @@
                 default:
                     UNREACHABLE();
             }
+#if !UNREACHABLE_IS_NORETURN
+            break;
+#endif
         }
         default:
             // All other types are identified by their group suffix
             return TextureGroupSuffix(type, imageInternalFormat);
     }
+#if !UNREACHABLE_IS_NORETURN
+    UNREACHABLE();
+    return "_RWTS_invalid_";
+#endif
 }
 
 TString DecorateField(const ImmutableString &string, const TStructure &structure)
diff --git a/src/compiler/translator/util.cpp b/src/compiler/translator/util.cpp
index 9b70217..5464ec5 100644
--- a/src/compiler/translator/util.cpp
+++ b/src/compiler/translator/util.cpp
@@ -216,6 +216,9 @@
                     return GL_FLOAT_VEC4;
                 default:
                     UNREACHABLE();
+#if !UNREACHABLE_IS_NORETURN
+                    return GL_NONE;
+#endif
             }
         }
         else if (type.isMatrix())
@@ -233,6 +236,9 @@
                             return GL_FLOAT_MAT2x4;
                         default:
                             UNREACHABLE();
+#if !UNREACHABLE_IS_NORETURN
+                            return GL_NONE;
+#endif
                     }
 
                 case 3:
@@ -246,6 +252,9 @@
                             return GL_FLOAT_MAT3x4;
                         default:
                             UNREACHABLE();
+#if !UNREACHABLE_IS_NORETURN
+                            return GL_NONE;
+#endif
                     }
 
                 case 4:
@@ -259,10 +268,16 @@
                             return GL_FLOAT_MAT4;
                         default:
                             UNREACHABLE();
+#if !UNREACHABLE_IS_NORETURN
+                            return GL_NONE;
+#endif
                     }
 
                 default:
                     UNREACHABLE();
+#if !UNREACHABLE_IS_NORETURN
+                    return GL_NONE;
+#endif
             }
         }
         else
@@ -284,6 +299,9 @@
                     return GL_INT_VEC4;
                 default:
                     UNREACHABLE();
+#if !UNREACHABLE_IS_NORETURN
+                    return GL_NONE;
+#endif
             }
         }
         else
@@ -306,6 +324,9 @@
                     return GL_UNSIGNED_INT_VEC4;
                 default:
                     UNREACHABLE();
+#if !UNREACHABLE_IS_NORETURN
+                    return GL_NONE;
+#endif
             }
         }
         else
@@ -328,6 +349,9 @@
                     return GL_BOOL_VEC4;
                 default:
                     UNREACHABLE();
+#if !UNREACHABLE_IS_NORETURN
+                    return GL_NONE;
+#endif
             }
         }
         else
@@ -554,7 +578,9 @@
 
         default:
             UNREACHABLE();
+#if !UNREACHABLE_IS_NORETURN
             return INTERPOLATION_SMOOTH;
+#endif
     }
 }
 
@@ -614,7 +640,9 @@
             return TType(EbtUInt, 4);
         default:
             UNREACHABLE();
+#if !UNREACHABLE_IS_NORETURN
             return TType();
+#endif
     }
 }