Looks good, just a couple of tweaks:

On 04/06/2011 07:22 PM, Rodrigo Rivas wrote:
+         error ("range-based %<for%> expression must have complete type");
+           error ("range-based %<for%> expression has an %<end%> member "
+                  "but not a %<begin%>");

Let's give the type of the range initializer in these error messages.

+static tree
+cp_parser_range_for_member_function (tree range, tree identifier)
+{
+  tree member, instance, fn;
+
+  member = finish_class_member_access_expr (range, identifier,
+                                           false, tf_warning_or_error);
+  if (member == error_mark_node)
+    return error_mark_node;
+
+  if (TREE_CODE (member) == COMPONENT_REF)
+    {
+      instance = TREE_OPERAND (member, 0);
+      fn = TREE_OPERAND (member, 1);
+    }
+  else
+    fn = NULL_TREE;
+
+  if (fn && BASELINK_P (fn))
+    return build_new_method_call (instance, fn,
+                                   NULL, NULL, LOOKUP_NORMAL,
+                                   NULL, tf_warning_or_error);
+  else
+    {
+      tree res;
+      VEC(tree,gc) *vec;
+
+      vec = make_tree_vector ();
+      res = finish_call_expr (member, &vec,
+                              /*disallow_virtual=*/false,
+                              /*koenig_p=*/false,
+                              tf_warning_or_error);
+      release_tree_vector (vec);
+      return res;
+    }
+}

Instead of handling this difference here, let's teach finish_call_expr to handle a COMPONENT_REF around a BASELINK.

Jason

Reply via email to