Add TINT_UNREACHABLE() and TINT_ICE() helper macros

Appends an error message with the tint compiler source location to the
provided diagnositic list, and then calls the global error handler if
one is set.
Tests and the sample app now register an error handler to print the
diagnostic list to stderr and abort when NDEBUG is not defined.

All uses of assert(false) have been fixed up to use these macros.

Change-Id: I2f63e51ed86ac23883301d280070bd1a357c6cb2
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/41620
Commit-Queue: dan sinclair <dsinclair@chromium.org>
Reviewed-by: dan sinclair <dsinclair@chromium.org>
diff --git a/src/type_determiner_test.cc b/src/type_determiner_test.cc
index 243d172..1d29466 100644
--- a/src/type_determiner_test.cc
+++ b/src/type_determiner_test.cc
@@ -142,7 +142,7 @@
   EXPECT_FALSE(td()->Determine());
 
   EXPECT_EQ(td()->error(),
-            "unknown statement type for type determination: Fake");
+            "error: unknown statement type for type determination: Fake");
 }
 
 TEST_F(TypeDeterminerTest, Stmt_Error_Unknown) {
@@ -152,7 +152,7 @@
   EXPECT_FALSE(td()->Determine());
 
   EXPECT_EQ(td()->error(),
-            "2:30: unknown statement type for type determination: Fake");
+            "2:30 error: unknown statement type for type determination: Fake");
 }
 
 TEST_F(TypeDeterminerTest, Stmt_Assign) {
@@ -396,8 +396,9 @@
 
   EXPECT_FALSE(td()->Determine());
 
-  EXPECT_EQ(td()->error(),
-            "12:34: v-0006: identifier must be declared before use: func");
+  EXPECT_EQ(
+      td()->error(),
+      "12:34 error: v-0006: identifier must be declared before use: func");
 }
 
 TEST_F(TypeDeterminerTest, Stmt_VariableDecl) {
@@ -530,7 +531,8 @@
 
   EXPECT_FALSE(td()->Determine());
 
-  EXPECT_EQ(td()->error(), "2:30: unknown expression for type determination");
+  EXPECT_EQ(td()->error(),
+            "2:30 error: unknown expression for type determination");
 }
 
 TEST_F(TypeDeterminerTest, Expr_ArrayAccessor_Array) {
@@ -1358,7 +1360,7 @@
 
   EXPECT_FALSE(td()->Determine());
 
-  EXPECT_EQ(td()->error(), "no matching call to " + name +
+  EXPECT_EQ(td()->error(), "error: no matching call to " + name +
                                "()\n\n"
                                "2 candidate functions:\n  " +
                                name + "(f32) -> f32\n  " + name +
@@ -1436,7 +1438,7 @@
 
   EXPECT_FALSE(td()->Determine());
 
-  EXPECT_EQ(td()->error(), "no matching call to " + name +
+  EXPECT_EQ(td()->error(), "error: no matching call to " + name +
                                "()\n\n"
                                "2 candidate functions:\n  " +
                                name + "(f32) -> bool\n  " + name +
@@ -1453,7 +1455,7 @@
 
   EXPECT_FALSE(td()->Determine());
 
-  EXPECT_EQ(td()->error(), "no matching call to " + name +
+  EXPECT_EQ(td()->error(), "error: no matching call to " + name +
                                "(ptr<f32>, f32)\n\n"
                                "2 candidate functions:\n  " +
                                name + "(f32) -> bool\n  " + name +
@@ -1687,7 +1689,7 @@
   EXPECT_FALSE(td()->Determine());
 
   EXPECT_EQ(td()->error(),
-            R"(no matching call to dot(f32, f32)
+            R"(error: no matching call to dot(f32, f32)
 
 1 candidate function:
   dot(vecN<f32>, vecN<f32>) -> f32
@@ -1703,7 +1705,7 @@
   EXPECT_FALSE(td()->Determine());
 
   EXPECT_EQ(td()->error(),
-            R"(no matching call to dot(ptr<vec4<i32>>, ptr<vec4<i32>>)
+            R"(error: no matching call to dot(ptr<vec4<i32>>, ptr<vec4<i32>>)
 
 1 candidate function:
   dot(vecN<f32>, vecN<f32>) -> f32
@@ -1733,7 +1735,7 @@
   EXPECT_FALSE(td()->Determine());
 
   EXPECT_EQ(td()->error(),
-            R"(no matching call to select()
+            R"(error: no matching call to select()
 
 2 candidate functions:
   select(T, T, bool) -> T  where: T is scalar
@@ -1748,7 +1750,7 @@
   EXPECT_FALSE(td()->Determine());
 
   EXPECT_EQ(td()->error(),
-            R"(no matching call to select(i32, i32, i32)
+            R"(error: no matching call to select(i32, i32, i32)
 
 2 candidate functions:
   select(T, T, bool) -> T  where: T is scalar
@@ -1764,7 +1766,7 @@
   EXPECT_FALSE(td()->Determine());
 
   EXPECT_EQ(td()->error(),
-            R"(no matching call to select(mat2x2<f32>, mat2x2<f32>, bool)
+            R"(error: no matching call to select(mat2x2<f32>, mat2x2<f32>, bool)
 
 2 candidate functions:
   select(T, T, bool) -> T  where: T is scalar
@@ -1779,7 +1781,7 @@
   EXPECT_FALSE(td()->Determine());
 
   EXPECT_EQ(td()->error(),
-            R"(no matching call to select(f32, vec2<f32>, bool)
+            R"(error: no matching call to select(f32, vec2<f32>, bool)
 
 2 candidate functions:
   select(T, T, bool) -> T  where: T is scalar
@@ -1795,7 +1797,7 @@
   EXPECT_FALSE(td()->Determine());
 
   EXPECT_EQ(td()->error(),
-            R"(no matching call to select(vec2<f32>, vec3<f32>, bool)
+            R"(error: no matching call to select(vec2<f32>, vec3<f32>, bool)
 
 2 candidate functions:
   select(T, T, bool) -> T  where: T is scalar
@@ -1856,7 +1858,7 @@
   EXPECT_FALSE(td()->Determine());
 
   EXPECT_EQ(td()->error(),
-            "function variable has a non-function storage class");
+            "error: function variable has a non-function storage class");
 }
 
 struct IntrinsicData {
@@ -1983,8 +1985,8 @@
 
   EXPECT_FALSE(td()->Determine());
 
-  EXPECT_THAT(td()->error(),
-              HasSubstr("no matching call to " + std::string(param.name)));
+  EXPECT_THAT(td()->error(), HasSubstr("error: no matching call to " +
+                                       std::string(param.name)));
 }
 
 TEST_P(Intrinsic_DataPackingTest, Error_NoParams) {
@@ -1995,8 +1997,8 @@
 
   EXPECT_FALSE(td()->Determine());
 
-  EXPECT_THAT(td()->error(),
-              HasSubstr("no matching call to " + std::string(param.name)));
+  EXPECT_THAT(td()->error(), HasSubstr("error: no matching call to " +
+                                       std::string(param.name)));
 }
 
 TEST_P(Intrinsic_DataPackingTest, Error_TooManyParams) {
@@ -2011,8 +2013,8 @@
 
   EXPECT_FALSE(td()->Determine());
 
-  EXPECT_THAT(td()->error(),
-              HasSubstr("no matching call to " + std::string(param.name)));
+  EXPECT_THAT(td()->error(), HasSubstr("error: no matching call to " +
+                                       std::string(param.name)));
 }
 
 INSTANTIATE_TEST_SUITE_P(
@@ -2089,12 +2091,12 @@
 
   EXPECT_FALSE(td()->Determine());
 
-  EXPECT_EQ(td()->error(), "no matching call to " + std::string(param.name) +
-                               "()\n\n"
-                               "2 candidate functions:\n  " +
-                               std::string(param.name) + "(f32) -> f32\n  " +
-                               std::string(param.name) +
-                               "(vecN<f32>) -> vecN<f32>\n");
+  EXPECT_EQ(td()->error(),
+            "error: no matching call to " + std::string(param.name) +
+                "()\n\n"
+                "2 candidate functions:\n  " +
+                std::string(param.name) + "(f32) -> f32\n  " +
+                std::string(param.name) + "(vecN<f32>) -> vecN<f32>\n");
 }
 
 TEST_P(Intrinsic_SingleParamTest, Error_TooManyParams) {
@@ -2105,12 +2107,12 @@
 
   EXPECT_FALSE(td()->Determine());
 
-  EXPECT_EQ(td()->error(), "no matching call to " + std::string(param.name) +
-                               "(i32, i32, i32)\n\n"
-                               "2 candidate functions:\n  " +
-                               std::string(param.name) + "(f32) -> f32\n  " +
-                               std::string(param.name) +
-                               "(vecN<f32>) -> vecN<f32>\n");
+  EXPECT_EQ(td()->error(),
+            "error: no matching call to " + std::string(param.name) +
+                "(i32, i32, i32)\n\n"
+                "2 candidate functions:\n  " +
+                std::string(param.name) + "(f32) -> f32\n  " +
+                std::string(param.name) + "(vecN<f32>) -> vecN<f32>\n");
 }
 
 INSTANTIATE_TEST_SUITE_P(
@@ -2157,7 +2159,7 @@
   EXPECT_FALSE(td()->Determine());
 
   EXPECT_EQ(td()->error(),
-            "no matching call to arrayLength(ptr<array<i32, 4>>)\n\n"
+            "error: no matching call to arrayLength(ptr<array<i32, 4>>)\n\n"
             "1 candidate function:\n"
             "  arrayLength(array<T>) -> u32\n");
 }
@@ -2180,7 +2182,7 @@
   EXPECT_FALSE(td()->Determine());
 
   EXPECT_EQ(td()->error(),
-            "no matching call to normalize()\n\n"
+            "error: no matching call to normalize()\n\n"
             "1 candidate function:\n"
             "  normalize(vecN<f32>) -> vecN<f32>\n");
 }
@@ -2216,7 +2218,7 @@
   EXPECT_FALSE(td()->Determine());
 
   EXPECT_EQ(td()->error(),
-            "no matching call to frexp(i32, ptr<workgroup, i32>)\n\n"
+            "error: no matching call to frexp(i32, ptr<workgroup, i32>)\n\n"
             "2 candidate functions:\n"
             "  frexp(f32, ptr<T>) -> f32  where: T is i32 or u32\n"
             "  frexp(vecN<f32>, ptr<vecN<T>>) -> vecN<f32>  "
@@ -2231,7 +2233,7 @@
   EXPECT_FALSE(td()->Determine());
 
   EXPECT_EQ(td()->error(),
-            "no matching call to frexp(f32, ptr<workgroup, f32>)\n\n"
+            "error: no matching call to frexp(f32, ptr<workgroup, f32>)\n\n"
             "2 candidate functions:\n"
             "  frexp(f32, ptr<T>) -> f32  where: T is i32 or u32\n"
             "  frexp(vecN<f32>, ptr<vecN<T>>) -> vecN<f32>  "
@@ -2245,7 +2247,7 @@
   EXPECT_FALSE(td()->Determine());
 
   EXPECT_EQ(td()->error(),
-            "no matching call to frexp(f32, i32)\n\n"
+            "error: no matching call to frexp(f32, i32)\n\n"
             "2 candidate functions:\n"
             "  frexp(f32, ptr<T>) -> f32  where: T is i32 or u32\n"
             "  frexp(vecN<f32>, ptr<vecN<T>>) -> vecN<f32>  "
@@ -2259,13 +2261,13 @@
 
   EXPECT_FALSE(td()->Determine());
 
-  EXPECT_EQ(
-      td()->error(),
-      "no matching call to frexp(vec2<f32>, ptr<workgroup, vec4<i32>>)\n\n"
-      "2 candidate functions:\n"
-      "  frexp(f32, ptr<T>) -> f32  where: T is i32 or u32\n"
-      "  frexp(vecN<f32>, ptr<vecN<T>>) -> vecN<f32>  "
-      "where: T is i32 or u32\n");
+  EXPECT_EQ(td()->error(),
+            "error: no matching call to frexp(vec2<f32>, ptr<workgroup, "
+            "vec4<i32>>)\n\n"
+            "2 candidate functions:\n"
+            "  frexp(f32, ptr<T>) -> f32  where: T is i32 or u32\n"
+            "  frexp(vecN<f32>, ptr<vecN<T>>) -> vecN<f32>  "
+            "where: T is i32 or u32\n");
 }
 
 TEST_F(IntrinsicDataTest, ModfScalar) {
@@ -2299,7 +2301,7 @@
   EXPECT_FALSE(td()->Determine());
 
   EXPECT_EQ(td()->error(),
-            "no matching call to modf(i32, ptr<workgroup, f32>)\n\n"
+            "error: no matching call to modf(i32, ptr<workgroup, f32>)\n\n"
             "2 candidate functions:\n"
             "  modf(f32, ptr<f32>) -> f32\n"
             "  modf(vecN<f32>, ptr<vecN<f32>>) -> vecN<f32>\n");
@@ -2313,7 +2315,7 @@
   EXPECT_FALSE(td()->Determine());
 
   EXPECT_EQ(td()->error(),
-            "no matching call to modf(f32, ptr<workgroup, i32>)\n\n"
+            "error: no matching call to modf(f32, ptr<workgroup, i32>)\n\n"
             "2 candidate functions:\n"
             "  modf(f32, ptr<f32>) -> f32\n"
             "  modf(vecN<f32>, ptr<vecN<f32>>) -> vecN<f32>\n");
@@ -2326,7 +2328,7 @@
   EXPECT_FALSE(td()->Determine());
 
   EXPECT_EQ(td()->error(),
-            "no matching call to modf(f32, f32)\n\n"
+            "error: no matching call to modf(f32, f32)\n\n"
             "2 candidate functions:\n"
             "  modf(f32, ptr<f32>) -> f32\n"
             "  modf(vecN<f32>, ptr<vecN<f32>>) -> vecN<f32>\n");
@@ -2340,7 +2342,8 @@
   EXPECT_FALSE(td()->Determine());
 
   EXPECT_EQ(td()->error(),
-            "no matching call to modf(vec2<f32>, ptr<workgroup, vec4<f32>>)\n\n"
+            "error: no matching call to modf(vec2<f32>, ptr<workgroup, "
+            "vec4<f32>>)\n\n"
             "2 candidate functions:\n"
             "  modf(vecN<f32>, ptr<vecN<f32>>) -> vecN<f32>\n"
             "  modf(f32, ptr<f32>) -> f32\n");
@@ -2443,7 +2446,7 @@
   EXPECT_FALSE(td()->Determine());
 
   EXPECT_EQ(td()->error(),
-            "no matching call to " + std::string(param.name) +
+            "error: no matching call to " + std::string(param.name) +
                 "()\n\n"
                 "2 candidate functions:\n  " +
                 std::string(param.name) +
@@ -2515,13 +2518,13 @@
 
   EXPECT_FALSE(td()->Determine());
 
-  EXPECT_EQ(td()->error(), "no matching call to " + std::string(param.name) +
-                               "(i32, i32, i32)\n\n"
-                               "2 candidate functions:\n  " +
-                               std::string(param.name) +
-                               "(f32, f32) -> f32\n  " +
-                               std::string(param.name) +
-                               "(vecN<f32>, vecN<f32>) -> vecN<f32>\n");
+  EXPECT_EQ(td()->error(),
+            "error: no matching call to " + std::string(param.name) +
+                "(i32, i32, i32)\n\n"
+                "2 candidate functions:\n  " +
+                std::string(param.name) + "(f32, f32) -> f32\n  " +
+                std::string(param.name) +
+                "(vecN<f32>, vecN<f32>) -> vecN<f32>\n");
 }
 
 TEST_P(Intrinsic_TwoParamTest, Error_NoParams) {
@@ -2532,13 +2535,13 @@
 
   EXPECT_FALSE(td()->Determine());
 
-  EXPECT_EQ(td()->error(), "no matching call to " + std::string(param.name) +
-                               "()\n\n"
-                               "2 candidate functions:\n  " +
-                               std::string(param.name) +
-                               "(f32, f32) -> f32\n  " +
-                               std::string(param.name) +
-                               "(vecN<f32>, vecN<f32>) -> vecN<f32>\n");
+  EXPECT_EQ(td()->error(),
+            "error: no matching call to " + std::string(param.name) +
+                "()\n\n"
+                "2 candidate functions:\n  " +
+                std::string(param.name) + "(f32, f32) -> f32\n  " +
+                std::string(param.name) +
+                "(vecN<f32>, vecN<f32>) -> vecN<f32>\n");
 }
 
 INSTANTIATE_TEST_SUITE_P(
@@ -2588,7 +2591,7 @@
 
   EXPECT_FALSE(td()->Determine());
 
-  EXPECT_EQ(td()->error(), R"(no matching call to cross()
+  EXPECT_EQ(td()->error(), R"(error: no matching call to cross()
 
 1 candidate function:
   cross(vec3<f32>, vec3<f32>) -> vec3<f32>
@@ -2601,7 +2604,7 @@
 
   EXPECT_FALSE(td()->Determine());
 
-  EXPECT_EQ(td()->error(), R"(no matching call to cross(f32, f32)
+  EXPECT_EQ(td()->error(), R"(error: no matching call to cross(f32, f32)
 
 1 candidate function:
   cross(vec3<f32>, vec3<f32>) -> vec3<f32>
@@ -2614,7 +2617,8 @@
 
   EXPECT_FALSE(td()->Determine());
 
-  EXPECT_EQ(td()->error(), R"(no matching call to cross(vec3<i32>, vec3<i32>)
+  EXPECT_EQ(td()->error(),
+            R"(error: no matching call to cross(vec3<i32>, vec3<i32>)
 
 1 candidate function:
   cross(vec3<f32>, vec3<f32>) -> vec3<f32>
@@ -2629,7 +2633,8 @@
 
   EXPECT_FALSE(td()->Determine());
 
-  EXPECT_EQ(td()->error(), R"(no matching call to cross(vec4<f32>, vec4<f32>)
+  EXPECT_EQ(td()->error(),
+            R"(error: no matching call to cross(vec4<f32>, vec4<f32>)
 
 1 candidate function:
   cross(vec3<f32>, vec3<f32>) -> vec3<f32>
@@ -2645,7 +2650,7 @@
   EXPECT_FALSE(td()->Determine());
 
   EXPECT_EQ(td()->error(),
-            R"(no matching call to cross(vec3<f32>, vec3<f32>, vec3<f32>)
+            R"(error: no matching call to cross(vec3<f32>, vec3<f32>, vec3<f32>)
 
 1 candidate function:
   cross(vec3<f32>, vec3<f32>) -> vec3<f32>
@@ -2668,7 +2673,7 @@
 
   EXPECT_FALSE(td()->Determine());
 
-  EXPECT_EQ(td()->error(), R"(no matching call to normalize()
+  EXPECT_EQ(td()->error(), R"(error: no matching call to normalize()
 
 1 candidate function:
   normalize(vecN<f32>) -> vecN<f32>
@@ -2710,7 +2715,7 @@
   EXPECT_FALSE(td()->Determine());
 
   EXPECT_EQ(td()->error(),
-            "no matching call to " + std::string(param.name) +
+            "error: no matching call to " + std::string(param.name) +
                 "()\n\n"
                 "2 candidate functions:\n  " +
                 std::string(param.name) + "(f32, f32, f32) -> f32\n  " +
@@ -2815,7 +2820,7 @@
   EXPECT_FALSE(td()->Determine());
 
   EXPECT_EQ(td()->error(),
-            "no matching call to " + std::string(param.name) +
+            "error: no matching call to " + std::string(param.name) +
                 "()\n\n"
                 "2 candidate functions:\n  " +
                 std::string(param.name) +
@@ -2866,7 +2871,7 @@
   EXPECT_FALSE(td()->Determine());
 
   EXPECT_EQ(td()->error(),
-            "no matching call to " + std::string(param.name) +
+            "error: no matching call to " + std::string(param.name) +
                 "()\n\n"
                 "2 candidate functions:\n  " +
                 std::string(param.name) +
@@ -2968,7 +2973,7 @@
   EXPECT_FALSE(td()->Determine());
 
   EXPECT_EQ(td()->error(),
-            "no matching call to " + std::string(param.name) +
+            "error: no matching call to " + std::string(param.name) +
                 "()\n\n"
                 "2 candidate functions:\n  " +
                 std::string(param.name) +
@@ -3027,10 +3032,11 @@
 
   EXPECT_FALSE(td()->Determine());
 
-  EXPECT_EQ(td()->error(),
-            "no matching call to determinant(ptr<function, mat2x3<f32>>)\n\n"
-            "1 candidate function:\n"
-            "  determinant(matNxN<f32>) -> f32\n");
+  EXPECT_EQ(
+      td()->error(),
+      "error: no matching call to determinant(ptr<function, mat2x3<f32>>)\n\n"
+      "1 candidate function:\n"
+      "  determinant(matNxN<f32>) -> f32\n");
 }
 
 TEST_F(TypeDeterminerTest, Intrinsic_Determinant_NotMatrix) {
@@ -3042,7 +3048,7 @@
   EXPECT_FALSE(td()->Determine());
 
   EXPECT_EQ(td()->error(),
-            "no matching call to determinant(ptr<function, f32>)\n\n"
+            "error: no matching call to determinant(ptr<function, f32>)\n\n"
             "1 candidate function:\n"
             "  determinant(matNxN<f32>) -> f32\n");
 }