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