tint/resolver: Propagate constant values between 'const's

Required for 'const' values that use other 'const' values in their
expressions.

Bug: tint:1580
Change-Id: I1d86281bec19340fdc0c60dc5b22eb3d6dc04cf5
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/94606
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: David Neto <dneto@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
diff --git a/src/tint/resolver/resolver.h b/src/tint/resolver/resolver.h
index c162142..aab772e 100644
--- a/src/tint/resolver/resolver.h
+++ b/src/tint/resolver/resolver.h
@@ -210,6 +210,8 @@
     /// nodes are guaranteed to have been already resolved and any constant values calculated.
     ////////////////////////////////////////////////////////////////////////////////////////////////
     sem::Constant EvaluateConstantValue(const ast::Expression* expr, const sem::Type* type);
+    sem::Constant EvaluateConstantValue(const ast::IdentifierExpression* ident,
+                                        const sem::Type* type);
     sem::Constant EvaluateConstantValue(const ast::LiteralExpression* literal,
                                         const sem::Type* type);
     sem::Constant EvaluateConstantValue(const ast::CallExpression* call, const sem::Type* type);
diff --git a/src/tint/resolver/resolver_constants.cc b/src/tint/resolver/resolver_constants.cc
index 3cb8ddf4..74e4327 100644
--- a/src/tint/resolver/resolver_constants.cc
+++ b/src/tint/resolver/resolver_constants.cc
@@ -154,11 +154,20 @@
 sem::Constant Resolver::EvaluateConstantValue(const ast::Expression* expr, const sem::Type* type) {
     return Switch(
         expr,  //
+        [&](const ast::IdentifierExpression* e) { return EvaluateConstantValue(e, type); },
         [&](const ast::LiteralExpression* e) { return EvaluateConstantValue(e, type); },
         [&](const ast::CallExpression* e) { return EvaluateConstantValue(e, type); },
         [&](const ast::IndexAccessorExpression* e) { return EvaluateConstantValue(e, type); });
 }
 
+sem::Constant Resolver::EvaluateConstantValue(const ast::IdentifierExpression* ident,
+                                              const sem::Type*) {
+    if (auto* sem = builder_->Sem().Get(ident)) {
+        return sem->ConstantValue();
+    }
+    return {};
+}
+
 sem::Constant Resolver::EvaluateConstantValue(const ast::LiteralExpression* literal,
                                               const sem::Type* type) {
     return Switch(
diff --git a/src/tint/resolver/variable_test.cc b/src/tint/resolver/variable_test.cc
index ba62906..4e56eaf 100644
--- a/src/tint/resolver/variable_test.cc
+++ b/src/tint/resolver/variable_test.cc
@@ -1052,8 +1052,7 @@
     EXPECT_EQ(Sem().Get(c_maf32)->ConstantValue().ElementCount(), 9u);
 }
 
-// Enable when constants propagate between 'const' variables
-TEST_F(ResolverVariableTest, DISABLED_LocalConst_PropagateConstValue) {
+TEST_F(ResolverVariableTest, LocalConst_PropagateConstValue) {
     auto* a = Const("a", nullptr, Expr(42_i));
     auto* b = Const("b", nullptr, Expr("a"));
     auto* c = Const("c", nullptr, Expr("b"));
@@ -1256,8 +1255,7 @@
     EXPECT_EQ(Sem().Get(c_maf32)->ConstantValue().ElementCount(), 9u);
 }
 
-// Enable when constants propagate between 'const' variables
-TEST_F(ResolverVariableTest, DISABLED_GlobalConst_PropagateConstValue) {
+TEST_F(ResolverVariableTest, GlobalConst_PropagateConstValue) {
     GlobalConst("b", nullptr, Expr("a"));
     auto* c = GlobalConst("c", nullptr, Expr("b"));
     GlobalConst("a", nullptr, Expr(42_i));