[validation] impl v-2000: module-scope variable and function name intersect

bug: tint:260

Change-Id: Ib282b77f475ed3ef4f8096229a41b1bd58342c5a
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/53121
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
Commit-Queue: Sarah Mashayekhi <sarahmashay@google.com>
diff --git a/src/resolver/function_validation_test.cc b/src/resolver/function_validation_test.cc
index 58ea6fb..1bb927c 100644
--- a/src/resolver/function_validation_test.cc
+++ b/src/resolver/function_validation_test.cc
@@ -60,7 +60,7 @@
 }
 
 TEST_F(ResolverFunctionValidationTest,
-       DISABLED_FunctionNameSameAsGlobalVariableName_Fail) {
+       FunctionNameSameAsGlobalVariableName_Fail) {
   // var foo:f32 = 3.14;
   // fn foo() -> void {}
 
@@ -78,7 +78,7 @@
 }
 
 TEST_F(ResolverFunctionValidationTest,
-       DISABLED_GlobalVariableNameSameAFunctionName_Fail) {
+       GlobalVariableNameSameAFunctionName_Fail) {
   // fn foo() -> void {}
   // var<private> foo:f32 = 3.14;
 
diff --git a/src/resolver/resolver.cc b/src/resolver/resolver.cc
index be740fd..e6c6875 100644
--- a/src/resolver/resolver.cc
+++ b/src/resolver/resolver.cc
@@ -606,6 +606,20 @@
 }
 
 bool Resolver::ValidateGlobalVariable(const VariableInfo* info) {
+  auto duplicate_func = symbol_to_function_.find(info->declaration->symbol());
+  if (duplicate_func != symbol_to_function_.end()) {
+    diagnostics_.add_error(
+        "v-2000",
+        "duplicate declaration '" +
+            builder_->Symbols().NameFor(info->declaration->symbol()) + "'",
+        info->declaration->source());
+    diagnostics_.add_note(
+        "'" + builder_->Symbols().NameFor(info->declaration->symbol()) +
+            "' first declared here:",
+        duplicate_func->second->declaration->source());
+    return false;
+  }
+
   for (auto* deco : info->declaration->decorations()) {
     if (info->declaration->is_const()) {
       if (auto* override_deco = deco->As<ast::OverrideDecoration>()) {
@@ -812,6 +826,22 @@
     return false;
   }
 
+  bool is_global = false;
+  VariableInfo* var;
+  if (variable_stack_.get(func->symbol(), &var, &is_global)) {
+    if (is_global) {
+      diagnostics_.add_error("v-2000",
+                             "duplicate declaration '" +
+                                 builder_->Symbols().NameFor(func->symbol()) +
+                                 "'",
+                             func->source());
+      diagnostics_.add_note("'" + builder_->Symbols().NameFor(func->symbol()) +
+                                "' first declared here:",
+                            var->declaration->source());
+      return false;
+    }
+  }
+
   auto stage_deco_count = 0;
   auto workgroup_deco_count = 0;
   for (auto* deco : func->decorations()) {