Improve error message when suffixing float with f

Fixes: tint:277
Change-Id: I7ec3bb758c7d80c95c6ecd51eebf4144b696bec5
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/33668
Commit-Queue: Ben Clayton <bclayton@google.com>
Reviewed-by: David Neto <dneto@google.com>
diff --git a/src/reader/wgsl/parser_impl.cc b/src/reader/wgsl/parser_impl.cc
index f914bd4..8e5c0cf 100644
--- a/src/reader/wgsl/parser_impl.cc
+++ b/src/reader/wgsl/parser_impl.cc
@@ -2622,6 +2622,11 @@
     return create<ast::UintLiteral>(type, t.to_u32());
   }
   if (match(Token::Type::kFloatLiteral)) {
+    auto p = peek();
+    if (p.IsIdentifier() && p.to_str() == "f") {
+      next();  // Consume 'f'
+      add_error(p.source(), "float literals must not be suffixed with 'f'");
+    }
     auto* type = module_.create<ast::type::F32Type>();
     return create<ast::FloatLiteral>(type, t.to_f32());
   }
diff --git a/src/reader/wgsl/parser_impl_error_msg_test.cc b/src/reader/wgsl/parser_impl_error_msg_test.cc
index cf5906b..8a53335 100644
--- a/src/reader/wgsl/parser_impl_error_msg_test.cc
+++ b/src/reader/wgsl/parser_impl_error_msg_test.cc
@@ -209,6 +209,13 @@
          "                             ^\n");
 }
 
+TEST_F(ParserImplErrorTest, FloatLiteralSuffixedWithF) {
+  EXPECT("var f : f32 = 1.23f;",
+         "test.wgsl:1:19 error: float literals must not be suffixed with 'f'\n"
+         "var f : f32 = 1.23f;\n"
+         "                  ^\n");
+}
+
 TEST_F(ParserImplErrorTest, ForLoopInitializerMissingSemicolon) {
   EXPECT("fn f() -> void { for (var i : i32 = 0 i < 8; i=i+1) {} }",
          "test.wgsl:1:39 error: expected ';' for initializer in for loop\n"