compiler: error for duplicate bool map keys

For golang/go#35945
Fixes golang/go#28104

Change-Id: I6d0f3188e99d99e92dabab68949d0d0d24841388
Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/403954
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: Than McIntosh <thanm@google.com>
diff --git a/go/expressions.cc b/go/expressions.cc
index 1b3b3bf..dce48e0 100644
--- a/go/expressions.cc
+++ b/go/expressions.cc
@@ -17266,6 +17266,8 @@
   Location location = this->location();
   Unordered_map(unsigned int, std::vector<Expression*>) st;
   Unordered_map(unsigned int, std::vector<Expression*>) nt;
+  bool saw_false = false;
+  bool saw_true = false;
   if (this->vals_ != NULL)
     {
       if (!this->has_keys_)
@@ -17300,6 +17302,7 @@
 	    continue;
 	  std::string sval;
 	  Numeric_constant nval;
+	  bool bval;
 	  if ((*p)->string_constant_value(&sval)) // Check string keys.
 	    {
 	      unsigned int h = Gogo::hash_string(sval, 0);
@@ -17373,6 +17376,19 @@
 		  mit->second.push_back(*p);
 		}
 	    }
+	  else if ((*p)->boolean_constant_value(&bval))
+	    {
+	      if ((bval && saw_true) || (!bval && saw_false))
+		{
+		  go_error_at((*p)->location(),
+			      "duplicate key in map literal");
+		  return Expression::make_error(location);
+		}
+	      if (bval)
+		saw_true = true;
+	      else
+		saw_false = true;
+	    }
 	}
     }