Unwrap pointer arguments to imported methods.

Make sure we unwrap pointers in import determination so things like
passing a member of a struct will determine the import correctly.

Change-Id: Id4565351c45e7798664c3368e2dec19b1440492d
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/20341
Reviewed-by: David Neto <dneto@google.com>
diff --git a/src/type_determiner.cc b/src/type_determiner.cc
index b081ead..317a8a5 100644
--- a/src/type_determiner.cc
+++ b/src/type_determiner.cc
@@ -329,9 +329,11 @@
       auto* result_type = GetImportData(expr->source(), imp->path(),
                                         ident->name(), expr->params(), &ext_id);
       if (result_type == nullptr) {
-        set_error(expr->source(),
-                  "Unable to determine result type for GLSL expression " +
-                      ident->name());
+        if (error_.empty()) {
+          set_error(expr->source(),
+                    "Unable to determine result type for GLSL expression " +
+                        ident->name());
+        }
         return false;
       }
 
@@ -644,13 +646,14 @@
                             std::to_string(params.size()));
       return nullptr;
     }
-    if (!params[0]->result_type()->is_float_scalar_or_vector()) {
+
+    auto* result_type = params[0]->result_type()->UnwrapPtrIfNeeded();
+    if (!result_type->is_float_scalar_or_vector()) {
       set_error(source, "incorrect type for " + name +
                             ". Requires a float scalar or a float vector");
       return nullptr;
     }
 
-    auto* result_type = params[0]->result_type();
     if (name == "round") {
       *id = GLSLstd450Round;
     } else if (name == "roundeven") {
@@ -726,18 +729,20 @@
                ". Expected 2 got " + std::to_string(params.size());
       return nullptr;
     }
-    if (!params[0]->result_type()->is_float_scalar_or_vector() ||
-        !params[1]->result_type()->is_float_scalar_or_vector()) {
+
+    auto* result_type_0 = params[0]->result_type()->UnwrapPtrIfNeeded();
+    auto* result_type_1 = params[1]->result_type()->UnwrapPtrIfNeeded();
+    if (!result_type_0->is_float_scalar_or_vector() ||
+        !result_type_1->is_float_scalar_or_vector()) {
       error_ = "incorrect type for " + name +
                ". Requires float scalar or a float vector values";
       return nullptr;
     }
-    if (params[0]->result_type() != params[1]->result_type()) {
+    if (result_type_0 != result_type_1) {
       error_ = "mismatched parameter types for " + name;
       return nullptr;
     }
 
-    auto* result_type = params[0]->result_type();
     if (name == "atan2") {
       *id = GLSLstd450Atan2;
     } else if (name == "pow") {
@@ -758,11 +763,12 @@
       *id = GLSLstd450Distance;
 
       // Distance returns a scalar of the same type as the parameter.
-      return result_type->is_float_scalar() ? result_type
-                                            : result_type->AsVector()->type();
+      return result_type_0->is_float_scalar()
+                 ? result_type_0
+                 : result_type_0->AsVector()->type();
     }
 
-    return result_type;
+    return result_type_0;
   } else if (name == "fclamp" || name == "fmix" || name == "smoothstep" ||
              name == "fma" || name == "nclamp" || name == "faceforward") {
     if (params.size() != 3) {
@@ -770,20 +776,22 @@
                ". Expected 3 got " + std::to_string(params.size());
       return nullptr;
     }
-    if (!params[0]->result_type()->is_float_scalar_or_vector() ||
-        !params[1]->result_type()->is_float_scalar_or_vector() ||
-        !params[2]->result_type()->is_float_scalar_or_vector()) {
+
+    auto* result_type_0 = params[0]->result_type()->UnwrapPtrIfNeeded();
+    auto* result_type_1 = params[1]->result_type()->UnwrapPtrIfNeeded();
+    auto* result_type_2 = params[2]->result_type()->UnwrapPtrIfNeeded();
+    if (!result_type_0->is_float_scalar_or_vector() ||
+        !result_type_1->is_float_scalar_or_vector() ||
+        !result_type_2->is_float_scalar_or_vector()) {
       error_ = "incorrect type for " + name +
                ". Requires float scalar or a float vector values";
       return nullptr;
     }
-    if (params[0]->result_type() != params[1]->result_type() ||
-        params[0]->result_type() != params[2]->result_type()) {
+    if (result_type_0 != result_type_1 || result_type_0 != result_type_2) {
       error_ = "mismatched parameter types for " + name;
       return nullptr;
     }
 
-    auto* result_type = params[0]->result_type();
     if (name == "fclamp") {
       *id = GLSLstd450FClamp;
     } else if (name == "fmix") {
@@ -798,7 +806,7 @@
       *id = GLSLstd450FaceForward;
     }
 
-    return result_type;
+    return result_type_0;
   }
 
   return nullptr;