On 07/12/2011 04:56 PM, Jason Merrill wrote:
A few more notes:

+      if (DECL_NAMESPACE_SCOPE_P (decl))
+       {
+         if (!check_literal_operator_args(decl,
+ &long_long_unsigned_p, &long_double_p))
+           {
+             error ("%qD has illegal argument list", decl);
+             return NULL_TREE;
+           }
+
+         if (CP_DECL_CONTEXT (decl) == global_namespace)
+           {
+             const char *suffix = UDLIT_OP_SUFFIX (DECL_NAME (decl));
+             if (long_long_unsigned_p)
+               {
+ if (cpp_interpret_int_suffix (suffix, strlen (suffix))) + warning (0, "integer suffix shadowed by implementation");
+               }
+             else if (long_double_p)
+               {
+ if (cpp_interpret_float_suffix (suffix, strlen (suffix)))
+                   warning (0, "floating point suffix"
+                               " shadowed by implementation");
+               }
+           }
+       }

Doesn't the shadowing apply everywhere, not just at file scope?
Yes, the shadowing should apply everywhere.  What test do I use to get that?
I seem to remember trying something like global_p without success.

+  if (cpp_userdef_string_p (tok->type))
+    {
+      string_tree = USERDEF_LITERAL_VALUE (tok->u.value);
+      tok->type = cpp_userdef_string_remove_type (tok->type);
+      curr_tok_is_userdef_p = true;
+    }

It seems like a mistake to change tok->type without changing the value. Why not just set the 'type' local variable appropriately?
The string lexer is comparing the types of string fragments during concatenation to make sure there is no inconsistency (wide vs. narrow, etc.) The type of string fragment for this purpose is is the string type w/o the user-definedness. Now maybe I should use a *second* local variable, say curr_type, for the current fragment. The variable type stores the initial string type and the type
all subsequent fragments must equal.

+             const char *curr_suffix = IDENTIFIER_POINTER (suffix_id);
+             if (have_suffix_p == 0)
+               {
+                 suffix = xstrdup (curr_suffix);
+                 have_suffix_p = 1;
+               }
+ else if (have_suffix_p == 1 && strcmp (suffix, curr_suffix) != 0)
...
+         USERDEF_LITERAL_SUFFIX_ID (literal) = get_identifier (suffix);

Just remember the identifier and compare it with ==. Identifiers are unique.
Done.

+  /* Lookup the name we got back from the id-expression.  */
+  decl = cp_parser_lookup_name (parser, name,

Maybe use lookup_function_nonclass?
I used this and it simplifies things somewhat. I'm trying to follow a crash while parsing friend declared literals.

Jason




Reply via email to