Commit ba89d661 by Zack Weinberg

cpplex.c (parse_name): Might have to glue a CPP_OTHER token before the name.

	* cpplex.c (parse_name): Might have to glue a CPP_OTHER token
	before the name.
	(lex_line): Glue @ onto the beginning of identifiers and
	string constants, in Objective-C mode.
	(output_token, spell_token): Handle CPP_OSTRING.
	(can_paste, maybe_paste_with_next): Handle pasting @ onto the
	beginning of a NAME or a STRING, in objc mode.

	* cpplib.c (get_define_node): Do not permit identifiers that
	begin with @ to be #defined.
	* cppmacro.c (CAN_PASTE_AFTER): Add CPP_OTHER.
	* cpplib.h (TTYPE_TABLE): Add CPP_OSTRING.

	* c-lang.c, objc/objc-act.c (build_objc_string): Delete.
	* c-tree.h (build_objc_string): Delete prototype.
	* objc/objc-tree.def: Delete OBJC_STRING_CST.
	* c-lex.c (yylex): Use build_string for all three kinds of strings.

	* gcc.dg/cpp/20000625-2.c: Don't expect a warning on line 4.

From-SVN: r35470
parent d31772ca
2000-08-03 Zack Weinberg <zack@wolery.cumb.org>
* cpplex.c (parse_name): Might have to glue a CPP_OTHER token
before the name.
(lex_line): Glue @ onto the beginning of identifiers and
string constants, in Objective-C mode.
(output_token, spell_token): Handle CPP_OSTRING.
(can_paste, maybe_paste_with_next): Handle pasting @ onto the
beginning of a NAME or a STRING, in objc mode.
* cpplib.c (get_define_node): Do not permit identifiers that
begin with @ to be #defined.
* cppmacro.c (CAN_PASTE_AFTER): Add CPP_OTHER.
* cpplib.h (TTYPE_TABLE): Add CPP_OSTRING.
* c-lang.c, objc/objc-act.c (build_objc_string): Delete.
* c-tree.h (build_objc_string): Delete prototype.
* objc/objc-tree.def: Delete OBJC_STRING_CST.
* c-lex.c (yylex): Use build_string for all three kinds of strings.
* c-parse.in, objc/objc-act.c: Update commentary.
2000-08-03 Mark Mitchell <mark@codesourcery.com> 2000-08-03 Mark Mitchell <mark@codesourcery.com>
* extend.texi: Fix typo in last change. * extend.texi: Fix typo in last change.
...@@ -33,8 +55,8 @@ Thu Aug 3 10:05:53 2000 Akiko Matsushita <matusita@sra.co.jp> ...@@ -33,8 +55,8 @@ Thu Aug 3 10:05:53 2000 Akiko Matsushita <matusita@sra.co.jp>
2000-08-03 Michael Poole <poole@troilus.org> 2000-08-03 Michael Poole <poole@troilus.org>
* tm.texi (Register Classes): Clarify order of sub-initializers * tm.texi (Register Classes): Clarify order of sub-initializers
in REG_CLASS_CONTENTS. in REG_CLASS_CONTENTS.
Thu Aug 3 15:53:03 2000 J"orn Rennecke <amylaar@cygnus.co.uk> Thu Aug 3 15:53:03 2000 J"orn Rennecke <amylaar@cygnus.co.uk>
...@@ -125,7 +147,7 @@ Wed Aug 2 15:59:34 MET DST 2000 Jan Hubicka <jh@suse.cz> ...@@ -125,7 +147,7 @@ Wed Aug 2 15:59:34 MET DST 2000 Jan Hubicka <jh@suse.cz>
* cppmain.c (cb_define, cb_undef): Don't generate any output * cppmain.c (cb_define, cb_undef): Don't generate any output
if not done_initializing. if not done_initializing.
* cpplex.c (maybe_paste_with_next): When the token after a ## * cpplex.c (maybe_paste_with_next): When the token after a ##
is an omitted rest argument, only delete the token before it is an omitted rest argument, only delete the token before it
if that token is a comma. Do not warn about bogus token if that token is a comma. Do not warn about bogus token
pastes for , ## rest_arg. pastes for , ## rest_arg.
...@@ -141,7 +163,7 @@ Wed Aug 2 15:59:34 MET DST 2000 Jan Hubicka <jh@suse.cz> ...@@ -141,7 +163,7 @@ Wed Aug 2 15:59:34 MET DST 2000 Jan Hubicka <jh@suse.cz>
* config/i386/beos-elf.h (INCLUDE_DEFAULTS): Add additional * config/i386/beos-elf.h (INCLUDE_DEFAULTS): Add additional
Be directories to search path. Be directories to search path.
Remove support for __declspec(dllimport) and __declspec(dllexport). Remove support for __declspec(dllimport) and __declspec(dllexport).
This is leftover cruft from the earlier BeOS gcc port when BeOS This is leftover cruft from the earlier BeOS gcc port when BeOS
used Microsoft's PE object file format. used Microsoft's PE object file format.
...@@ -159,15 +181,15 @@ Wed Aug 2 15:59:34 MET DST 2000 Jan Hubicka <jh@suse.cz> ...@@ -159,15 +181,15 @@ Wed Aug 2 15:59:34 MET DST 2000 Jan Hubicka <jh@suse.cz>
(ASM_OUTPUT_ALIGNED_DECL_COMMON): Remove. (ASM_OUTPUT_ALIGNED_DECL_COMMON): Remove.
(ASM_OUTPUT_ALIGNED_LOCAL): Remove. (ASM_OUTPUT_ALIGNED_LOCAL): Remove.
(STRIP_NAME_ENCODING): Remove. (STRIP_NAME_ENCODING): Remove.
Remove support for obsolete version of BeOS that is no longer Remove support for obsolete version of BeOS that is no longer
supported by Be. supported by Be.
* configure.in (i*86-*-beospe*): Remove. * configure.in (i*86-*-beospe*): Remove.
* config/i386/beos-pe.h: Remove. * config/i386/beos-pe.h: Remove.
2000-08-01 Jeffrey Oldham <oldham@codesourcery.com> 2000-08-01 Jeffrey Oldham <oldham@codesourcery.com>
Mark Mitchell <mark@codesourcery.com> Mark Mitchell <mark@codesourcery.com>
* Makefile.in (OBJS): Added dce.o. * Makefile.in (OBJS): Added dce.o.
(ssa.o): Updated target to include ssa.h. (ssa.o): Updated target to include ssa.h.
(flow.o): Likewise. (flow.o): Likewise.
...@@ -176,7 +198,7 @@ Wed Aug 2 15:59:34 MET DST 2000 Jan Hubicka <jh@suse.cz> ...@@ -176,7 +198,7 @@ Wed Aug 2 15:59:34 MET DST 2000 Jan Hubicka <jh@suse.cz>
* basic-block.h: Added comments. * basic-block.h: Added comments.
(INVALID_BLOCK): Added definition. (INVALID_BLOCK): Added definition.
(connect_infinite_loops_to_exit): Added declaration. (connect_infinite_loops_to_exit): Added declaration.
Moved SSA declarations to ssa.h. Moved SSA declarations to ssa.h.
* flow.c: Added inclusion of ssa.h. * flow.c: Added inclusion of ssa.h.
(struct depth_first_search_dsS, depth_first_search_ds): (struct depth_first_search_dsS, depth_first_search_ds):
Added definitions. Added definitions.
...@@ -205,9 +227,9 @@ Wed Aug 2 15:59:34 MET DST 2000 Jan Hubicka <jh@suse.cz> ...@@ -205,9 +227,9 @@ Wed Aug 2 15:59:34 MET DST 2000 Jan Hubicka <jh@suse.cz>
Defined flag_ssa. Defined flag_ssa.
(f_options): Added dce entry. (f_options): Added dce entry.
* invoke.texi: Document -fdce. Emphasize experimental status of * invoke.texi: Document -fdce. Emphasize experimental status of
-fssa. -fssa.
* dce: New file. * dce: New file.
2000-08-01 Zack Weinberg <zack@wolery.cumb.org> 2000-08-01 Zack Weinberg <zack@wolery.cumb.org>
* cpperror.c (v_message): Split into _cpp_begin_message and * cpperror.c (v_message): Split into _cpp_begin_message and
...@@ -619,7 +641,7 @@ Sun Jul 30 20:27:36 MET DST 2000 Jan Hubicka <jh@suse.cz> ...@@ -619,7 +641,7 @@ Sun Jul 30 20:27:36 MET DST 2000 Jan Hubicka <jh@suse.cz>
Sun Jul 30 20:25:21 MET DST 2000 Jan Hubicka <jh@suse.cz> Sun Jul 30 20:25:21 MET DST 2000 Jan Hubicka <jh@suse.cz>
* function.c (assign_stack_local_1, assign_stack_temp_for_type): * function.c (assign_stack_local_1, assign_stack_temp_for_type):
Do not call gen_mode_alignment when mode is BLKmode. Do not call gen_mode_alignment when mode is BLKmode.
Sun Jul 30 20:21:54 MET DST 2000 Jan Hubicka <jh@suse.cz> Sun Jul 30 20:21:54 MET DST 2000 Jan Hubicka <jh@suse.cz>
...@@ -655,7 +677,7 @@ Sun Jul 30 20:08:37 MET DST 2000 Jan Hubicka <jh@suse.cz> ...@@ -655,7 +677,7 @@ Sun Jul 30 20:08:37 MET DST 2000 Jan Hubicka <jh@suse.cz>
(c4x_valid_type_attribute_p): Likewise. (c4x_valid_type_attribute_p): Likewise.
* config/c4x/c4x.h (FUNCTION_PROLOGUE, FUNCTION_EPILOGUE): Delete. * config/c4x/c4x.h (FUNCTION_PROLOGUE, FUNCTION_EPILOGUE): Delete.
(FUNCTION_BLOCK_PROFILER_EXIT): Convert to emit RTL. (FUNCTION_BLOCK_PROFILER_EXIT): Convert to emit RTL.
2000-07-30 Michael Hayes <m.hayes@elec.canterbury.ac.nz> 2000-07-30 Michael Hayes <m.hayes@elec.canterbury.ac.nz>
* config/c4x/c4x.c (c4x_emit_move_sequence): Use loadqi_big_constant * config/c4x/c4x.c (c4x_emit_move_sequence): Use loadqi_big_constant
...@@ -672,7 +694,7 @@ Sun Jul 30 20:08:37 MET DST 2000 Jan Hubicka <jh@suse.cz> ...@@ -672,7 +694,7 @@ Sun Jul 30 20:08:37 MET DST 2000 Jan Hubicka <jh@suse.cz>
* config/c4x/c4x.h (ASM_FORMAT_PRIVATE_NAME): Output $ in label. * config/c4x/c4x.h (ASM_FORMAT_PRIVATE_NAME): Output $ in label.
2000-07-30 Michael Hayes <m.hayes@elec.canterbury.ac.nz> 2000-07-30 Michael Hayes <m.hayes@elec.canterbury.ac.nz>
* config/c4x/c4x.h (IS_XXX_REGNO): Rewrite to avoid unsigned warnings. * config/c4x/c4x.h (IS_XXX_REGNO): Rewrite to avoid unsigned warnings.
2000-07-30 Michael Hayes <m.hayes@elec.canterbury.ac.nz> 2000-07-30 Michael Hayes <m.hayes@elec.canterbury.ac.nz>
...@@ -699,7 +721,7 @@ Sun Jul 30 20:08:37 MET DST 2000 Jan Hubicka <jh@suse.cz> ...@@ -699,7 +721,7 @@ Sun Jul 30 20:08:37 MET DST 2000 Jan Hubicka <jh@suse.cz>
(make_equivalent_phi_alternatives_equivalent): Likewise. (make_equivalent_phi_alternatives_equivalent): Likewise.
(for_each_successor_phi): Likewise. (for_each_successor_phi): Likewise.
(convert_from_ssa): Modify phi-node deletion algorithm. (convert_from_ssa): Modify phi-node deletion algorithm.
2000-07-29 Andreas Jaeger <aj@suse.de> 2000-07-29 Andreas Jaeger <aj@suse.de>
* configure.in (mips*-*-linux*): Use mips*el to check for little * configure.in (mips*-*-linux*): Use mips*el to check for little
...@@ -771,7 +793,7 @@ Sun Jul 30 20:08:37 MET DST 2000 Jan Hubicka <jh@suse.cz> ...@@ -771,7 +793,7 @@ Sun Jul 30 20:08:37 MET DST 2000 Jan Hubicka <jh@suse.cz>
(__do_global_ctors): Prototype. (__do_global_ctors): Prototype.
* gcse.c (record_one_set, pre_delete): Remove unused variables. * gcse.c (record_one_set, pre_delete): Remove unused variables.
* rs6000.c (rs6000_maybe_dead): Delete unused prototype. * rs6000.c (rs6000_maybe_dead): Delete unused prototype.
(print_operand): Initialize variable `t'. (print_operand): Initialize variable `t'.
...@@ -791,7 +813,7 @@ Sun Jul 30 20:08:37 MET DST 2000 Jan Hubicka <jh@suse.cz> ...@@ -791,7 +813,7 @@ Sun Jul 30 20:08:37 MET DST 2000 Jan Hubicka <jh@suse.cz>
(--with-included-gettext): Likewise. (--with-included-gettext): Likewise.
(--enable-maintainer-mode): New description added. (--enable-maintainer-mode): New description added.
* extend.texi (-fstrict-prototype): Add missing '.'. * extend.texi (-fstrict-prototype): Add missing '.'.
2000-07-27 Jim Wilson <wilson@cygnus.com> 2000-07-27 Jim Wilson <wilson@cygnus.com>
* dwarf2out.c (gen_decl_die): Don't call gen_abstract_function if * dwarf2out.c (gen_decl_die): Don't call gen_abstract_function if
...@@ -860,7 +882,7 @@ Thu Jul 27 09:25:17 2000 Akiko Matsushita <matusita@sra.co.jp> ...@@ -860,7 +882,7 @@ Thu Jul 27 09:25:17 2000 Akiko Matsushita <matusita@sra.co.jp>
* pa/x-pa-hpux: Add -D_HIUX_SOURCE to FIXPROTO_DEFINES * pa/x-pa-hpux: Add -D_HIUX_SOURCE to FIXPROTO_DEFINES
for HI-UX/WE2 systems. for HI-UX/WE2 systems.
2000-07-24 Bruce Korb <bkorb@gnu.org> 2000-07-24 Bruce Korb <bkorb@gnu.org>
* fixincl/fixfixes.c(emit_gnu_type): rewrote to *rely* on GCC * fixincl/fixfixes.c(emit_gnu_type): rewrote to *rely* on GCC
...@@ -873,9 +895,9 @@ Thu Jul 27 11:54:17 2000 Andrew Cagney <cagney@b1.cygnus.com> ...@@ -873,9 +895,9 @@ Thu Jul 27 11:54:17 2000 Andrew Cagney <cagney@b1.cygnus.com>
* cpp.texi: Append a trailing full-stop to xrefs where needed. * cpp.texi: Append a trailing full-stop to xrefs where needed.
2000-07-26 Dave Pitts <dpitts@cozx.com> 2000-07-26 Dave Pitts <dpitts@cozx.com>
* i370.c: Remove LONGEXTERNAL ifdef from alias_number. Added hash * i370.c: Remove LONGEXTERNAL ifdef from alias_number. Added hash
routine constants. routine constants.
(mvs_hash_alias): New function. (mvs_hash_alias): New function.
(mvs_add_alias): Change argument spacing. (mvs_add_alias): Change argument spacing.
...@@ -1037,7 +1059,7 @@ Tue Jul 25 23:08:33 2000 J"orn Rennecke <amylaar@cygnus.co.uk> ...@@ -1037,7 +1059,7 @@ Tue Jul 25 23:08:33 2000 J"orn Rennecke <amylaar@cygnus.co.uk>
UNALIGNED_INT_ASM_OP. UNALIGNED_INT_ASM_OP.
(def_cfa_1): Don't emit def_cfa_register or def_cfa_offset to adjust (def_cfa_1): Don't emit def_cfa_register or def_cfa_offset to adjust
a location expression. a location expression.
(dwarf2out_frame_debug_expr): Lose cfa_old_reg stuff. Don't (dwarf2out_frame_debug_expr): Lose cfa_old_reg stuff. Don't
assume indirect access if we're saving the CFA address exactly. assume indirect access if we're saving the CFA address exactly.
* Makefile.in (bootstrap): Move -BstageN/ to the end. * Makefile.in (bootstrap): Move -BstageN/ to the end.
...@@ -1074,9 +1096,9 @@ Mon Jul 24 02:04:52 2000 Jeffrey A Law (law@cygnus.com) ...@@ -1074,9 +1096,9 @@ Mon Jul 24 02:04:52 2000 Jeffrey A Law (law@cygnus.com)
* c-semantics.c (make_rtl_for_local_static): Use TREE_ASM_WRITTEN * c-semantics.c (make_rtl_for_local_static): Use TREE_ASM_WRITTEN
to figure out whether or not a variable has already been emitted. to figure out whether or not a variable has already been emitted.
Sun Jul 23 14:49:12 2000 Jason Eckhardt <jle@cygnus.com> Sun Jul 23 14:49:12 2000 Jason Eckhardt <jle@cygnus.com>
* config/i860/i860.md (untyped_call expander): Use GEN_CALL * config/i860/i860.md (untyped_call expander): Use GEN_CALL
instead of gen_call. instead of gen_call.
Sun Jul 23 11:52:03 2000 George Helffrich (george@gly.bris.ac.uk) Sun Jul 23 11:52:03 2000 George Helffrich (george@gly.bris.ac.uk)
......
...@@ -171,15 +171,6 @@ recognize_objc_keyword () ...@@ -171,15 +171,6 @@ recognize_objc_keyword ()
return 0; return 0;
} }
tree
build_objc_string (len, str)
int len ATTRIBUTE_UNUSED;
const char *str ATTRIBUTE_UNUSED;
{
abort ();
return NULL_TREE;
}
/* Used by c-typeck.c (build_external_ref), but only for objc. */ /* Used by c-typeck.c (build_external_ref), but only for objc. */
tree tree
......
...@@ -2268,25 +2268,19 @@ yylex () ...@@ -2268,25 +2268,19 @@ yylex ()
/* We have read the entire constant. /* We have read the entire constant.
Construct a STRING_CST for the result. */ Construct a STRING_CST for the result. */
yylval.ttype = build_string (p - (token_buffer + 1), token_buffer + 1);
if (wide_flag) if (wide_flag)
{ {
yylval.ttype = build_string (p - (token_buffer + 1),
token_buffer + 1);
TREE_TYPE (yylval.ttype) = wchar_array_type_node; TREE_TYPE (yylval.ttype) = wchar_array_type_node;
value = STRING; value = STRING;
} }
else if (objc_flag) else if (objc_flag)
{ {
/* Return an Objective-C @"..." constant string object. */
yylval.ttype = build_objc_string (p - (token_buffer + 1),
token_buffer + 1);
TREE_TYPE (yylval.ttype) = char_array_type_node; TREE_TYPE (yylval.ttype) = char_array_type_node;
value = OBJC_STRING; value = OBJC_STRING;
} }
else else
{ {
yylval.ttype = build_string (p - (token_buffer + 1),
token_buffer + 1);
TREE_TYPE (yylval.ttype) = char_array_type_node; TREE_TYPE (yylval.ttype) = char_array_type_node;
value = STRING; value = STRING;
} }
......
...@@ -150,7 +150,7 @@ end ifc ...@@ -150,7 +150,7 @@ end ifc
%token CLASSNAME PUBLIC PRIVATE PROTECTED PROTOCOL OBJECTNAME CLASS ALIAS %token CLASSNAME PUBLIC PRIVATE PROTECTED PROTOCOL OBJECTNAME CLASS ALIAS
/* Objective-C string constants in raw form. /* Objective-C string constants in raw form.
yylval is an OBJC_STRING_CST node. */ yylval is an STRING_CST node. */
%token OBJC_STRING %token OBJC_STRING
...@@ -753,8 +753,8 @@ end ifc ...@@ -753,8 +753,8 @@ end ifc
; ;
ifobjc ifobjc
/* Produces an OBJC_STRING_CST with perhaps more OBJC_STRING_CSTs chained /* Produces an STRING_CST with perhaps more STRING_CSTs chained
onto it. */ onto it, which is to be read as an ObjC string object. */
objc_string: objc_string:
OBJC_STRING OBJC_STRING
| objc_string OBJC_STRING | objc_string OBJC_STRING
......
...@@ -142,7 +142,6 @@ extern int maybe_objc_comptypes PARAMS ((tree, tree, int)); ...@@ -142,7 +142,6 @@ extern int maybe_objc_comptypes PARAMS ((tree, tree, int));
extern tree maybe_building_objc_message_expr PARAMS ((void)); extern tree maybe_building_objc_message_expr PARAMS ((void));
extern tree maybe_objc_method_name PARAMS ((tree)); extern tree maybe_objc_method_name PARAMS ((tree));
extern int recognize_objc_keyword PARAMS ((void)); extern int recognize_objc_keyword PARAMS ((void));
extern tree build_objc_string PARAMS ((int, const char *));
extern tree lookup_objc_ivar PARAMS ((tree)); extern tree lookup_objc_ivar PARAMS ((tree));
/* in c-parse.in */ /* in c-parse.in */
......
...@@ -1008,15 +1008,27 @@ parse_name (pfile, tok, cur, rlimit) ...@@ -1008,15 +1008,27 @@ parse_name (pfile, tok, cur, rlimit)
} }
len = cur - name; len = cur - name;
if (tok->val.node == 0) if (tok->type == CPP_NAME && tok->val.node == 0)
tok->val.node = _cpp_lookup_with_hash (pfile, name, len, r); tok->val.node = _cpp_lookup_with_hash (pfile, name, len, r);
else else
{ {
unsigned int oldlen = tok->val.node->length; unsigned int oldlen;
U_CHAR *newname = alloca (oldlen + len); U_CHAR *newname;
memcpy (newname, tok->val.node->name, oldlen);
if (tok->type == CPP_NAME)
oldlen = tok->val.node->length;
else
oldlen = 1;
newname = alloca (oldlen + len);
if (tok->type == CPP_NAME)
memcpy (newname, tok->val.node->name, oldlen);
else
newname[0] = tok->val.aux;
memcpy (newname + oldlen, name, len); memcpy (newname + oldlen, name, len);
tok->val.node = cpp_lookup (pfile, newname, len + oldlen); tok->val.node = cpp_lookup (pfile, newname, len + oldlen);
tok->type = CPP_NAME;
} }
return cur; return cur;
...@@ -1373,8 +1385,16 @@ lex_line (pfile, list) ...@@ -1373,8 +1385,16 @@ lex_line (pfile, list)
case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
case 'Y': case 'Z': case 'Y': case 'Z':
cur--; /* Backup character. */ cur--; /* Backup character. */
cur_token->val.node = 0;
cur_token->type = CPP_NAME; /* Identifier, macro etc. */ /* In Objective C, '@' may begin certain keywords. */
if (CPP_OPTION (pfile, objc) && cur_token[-1].type == CPP_OTHER
&& cur_token[-1].val.aux == '@' && IMMED_TOKEN ())
cur_token--;
else
{
cur_token->val.node = 0;
cur_token->type = CPP_NAME; /* Identifier, macro etc. */
}
continue_name: continue_name:
cur = parse_name (pfile, cur_token, cur, buffer->rlimit); cur = parse_name (pfile, cur_token, cur, buffer->rlimit);
...@@ -1394,12 +1414,21 @@ lex_line (pfile, list) ...@@ -1394,12 +1414,21 @@ lex_line (pfile, list)
break; break;
case '\'': case '\'':
cur_token->type = CPP_CHAR;
if (cur_token[-1].type == CPP_NAME && IMMED_TOKEN ()
&& cur_token[-1].val.node == pfile->spec_nodes->n_L)
BACKUP_TOKEN (CPP_WCHAR);
goto do_parse_string;
case '\"': case '\"':
cur_token->type = c == '\'' ? CPP_CHAR : CPP_STRING; cur_token->type = CPP_STRING;
/* Do we have a wide string? */
if (cur_token[-1].type == CPP_NAME && IMMED_TOKEN () if (cur_token[-1].type == CPP_NAME && IMMED_TOKEN ()
&& cur_token[-1].val.node == pfile->spec_nodes->n_L) && cur_token[-1].val.node == pfile->spec_nodes->n_L)
BACKUP_TOKEN (c == '\'' ? CPP_WCHAR : CPP_WSTRING); BACKUP_TOKEN (CPP_WSTRING);
else if (CPP_OPTION (pfile, objc)
&& cur_token[-1].type == CPP_OTHER && IMMED_TOKEN ()
&& cur_token[-1].val.aux == '@')
BACKUP_TOKEN (CPP_OSTRING);
do_parse_string: do_parse_string:
/* Here c is one of ' " or >. */ /* Here c is one of ' " or >. */
...@@ -1883,20 +1912,21 @@ output_token (pfile, fp, token, prev, white) ...@@ -1883,20 +1912,21 @@ output_token (pfile, fp, token, prev, white)
case SPELL_STRING: case SPELL_STRING:
{ {
if (token->type == CPP_WSTRING || token->type == CPP_WCHAR) int left, right, tag;
putc ('L', fp); switch (token->type)
{
if (token->type == CPP_STRING || token->type == CPP_WSTRING) case CPP_STRING: left = '"'; right = '"'; tag = '\0'; break;
putc ('"', fp); case CPP_WSTRING: left = '"'; right = '"'; tag = 'L'; break;
if (token->type == CPP_CHAR || token->type == CPP_WCHAR) case CPP_OSTRING: left = '"'; right = '"'; tag = '@'; break;
putc ('\'', fp); case CPP_CHAR: left = '\''; right = '\''; tag = '\0'; break;
case CPP_WCHAR: left = '\''; right = '\''; tag = 'L'; break;
case CPP_HEADER_NAME: left = '<'; right = '>'; tag = '\0'; break;
default: left = '\0'; right = '\0'; tag = '\0'; break;
}
if (tag) putc (tag, fp);
if (left) putc (left, fp);
fwrite (token->val.str.text, 1, token->val.str.len, fp); fwrite (token->val.str.text, 1, token->val.str.len, fp);
if (right) putc (right, fp);
if (token->type == CPP_STRING || token->type == CPP_WSTRING)
putc ('"', fp);
if (token->type == CPP_CHAR || token->type == CPP_WCHAR)
putc ('\'', fp);
} }
break; break;
...@@ -1999,21 +2029,22 @@ spell_token (pfile, token, buffer) ...@@ -1999,21 +2029,22 @@ spell_token (pfile, token, buffer)
case SPELL_STRING: case SPELL_STRING:
{ {
if (token->type == CPP_WSTRING || token->type == CPP_WCHAR) int left, right, tag;
*buffer++ = 'L'; switch (token->type)
{
if (token->type == CPP_STRING || token->type == CPP_WSTRING) case CPP_STRING: left = '"'; right = '"'; tag = '\0'; break;
*buffer++ = '"'; case CPP_WSTRING: left = '"'; right = '"'; tag = 'L'; break;
if (token->type == CPP_CHAR || token->type == CPP_WCHAR) case CPP_OSTRING: left = '"'; right = '"'; tag = '@'; break;
*buffer++ = '\''; case CPP_CHAR: left = '\''; right = '\''; tag = '\0'; break;
case CPP_WCHAR: left = '\''; right = '\''; tag = 'L'; break;
case CPP_HEADER_NAME: left = '<'; right = '>'; tag = '\0'; break;
default: left = '\0'; right = '\0'; tag = '\0'; break;
}
if (tag) *buffer++ = tag;
if (left) *buffer++ = left;
memcpy (buffer, token->val.str.text, token->val.str.len); memcpy (buffer, token->val.str.text, token->val.str.len);
buffer += token->val.str.len; buffer += token->val.str.len;
if (right) *buffer++ = right;
if (token->type == CPP_STRING || token->type == CPP_WSTRING)
*buffer++ = '"';
if (token->type == CPP_CHAR || token->type == CPP_WCHAR)
*buffer++ = '\'';
} }
break; break;
...@@ -2700,6 +2731,13 @@ can_paste (pfile, token1, token2, digraph) ...@@ -2700,6 +2731,13 @@ can_paste (pfile, token1, token2, digraph)
return CPP_NUMBER; return CPP_NUMBER;
break; break;
case CPP_OTHER:
if (CPP_OPTION (pfile, objc) && token1->val.aux == '@')
{
if (b == CPP_NAME) return CPP_NAME;
if (b == CPP_STRING) return CPP_OSTRING;
}
default: default:
break; break;
} }
...@@ -2789,7 +2827,8 @@ maybe_paste_with_next (pfile, token) ...@@ -2789,7 +2827,8 @@ maybe_paste_with_next (pfile, token)
pasted->val.str.len = end - buf; pasted->val.str.len = end - buf;
} }
} }
else if (type == CPP_WCHAR || type == CPP_WSTRING) else if (type == CPP_WCHAR || type == CPP_WSTRING
|| type == CPP_OSTRING)
pasted = duplicate_token (pfile, second); pasted = duplicate_token (pfile, second);
else else
{ {
......
...@@ -242,6 +242,16 @@ get_define_node (pfile) ...@@ -242,6 +242,16 @@ get_define_node (pfile)
return 0; return 0;
} }
/* In Objective C, some keywords begin with '@', but general identifiers
do not, and you're not allowed to #define them. */
if (token->val.node->name[0] == '@')
{
cpp_error_with_line (pfile, token->line, token->col,
"\"%s\" cannot be used as a macro name",
token->val.node->name);
return 0;
}
/* Check for poisoned identifiers now. */ /* Check for poisoned identifiers now. */
if (token->val.node->type == T_POISON) if (token->val.node->type == T_POISON)
{ {
......
...@@ -123,6 +123,7 @@ typedef struct cpp_hashnode cpp_hashnode; ...@@ -123,6 +123,7 @@ typedef struct cpp_hashnode cpp_hashnode;
\ \
TK(CPP_STRING, SPELL_STRING) /* "string" */ \ TK(CPP_STRING, SPELL_STRING) /* "string" */ \
TK(CPP_WSTRING, SPELL_STRING) /* L"string" */ \ TK(CPP_WSTRING, SPELL_STRING) /* L"string" */ \
TK(CPP_OSTRING, SPELL_STRING) /* @"string" - Objective C */ \
TK(CPP_HEADER_NAME, SPELL_STRING) /* <stdio.h> in #include */ \ TK(CPP_HEADER_NAME, SPELL_STRING) /* <stdio.h> in #include */ \
\ \
TK(CPP_COMMENT, SPELL_STRING) /* Only if output comments. */ \ TK(CPP_COMMENT, SPELL_STRING) /* Only if output comments. */ \
......
...@@ -55,12 +55,14 @@ static cpp_toklist * alloc_macro PARAMS ((cpp_reader *, struct macro_info *)); ...@@ -55,12 +55,14 @@ static cpp_toklist * alloc_macro PARAMS ((cpp_reader *, struct macro_info *));
/* These are all the tokens that can have something pasted after them. /* These are all the tokens that can have something pasted after them.
Comma is included in the list only to support the GNU varargs extension Comma is included in the list only to support the GNU varargs extension
(where you write a ## b and a disappears if b is an empty rest argument). */ (where you write a ## b and a disappears if b is an empty rest argument).
CPP_OTHER is included because of Objective C's use of '@'. */
#define CAN_PASTE_AFTER(type) \ #define CAN_PASTE_AFTER(type) \
((type) <= CPP_LAST_EQ || (type) == CPP_COLON || (type) == CPP_HASH \ ((type) <= CPP_LAST_EQ || (type) == CPP_COLON || (type) == CPP_HASH \
|| (type) == CPP_DEREF || (type) == CPP_DOT || (type) == CPP_NAME \ || (type) == CPP_DEREF || (type) == CPP_DOT || (type) == CPP_NAME \
|| (type) == CPP_INT || (type) == CPP_FLOAT || (type) == CPP_NUMBER \ || (type) == CPP_INT || (type) == CPP_FLOAT || (type) == CPP_NUMBER \
|| (type) == CPP_MACRO_ARG || (type) == CPP_PLACEMARKER || (type) == CPP_COMMA) || (type) == CPP_MACRO_ARG || (type) == CPP_PLACEMARKER \
|| (type) == CPP_COMMA || (type) == CPP_OTHER)
/* Scans for a given token, returning the parameter number if found, /* Scans for a given token, returning the parameter number if found,
or 0 if not found. Scans from FIRST to TOKEN - 1 or the first or 0 if not found. Scans from FIRST to TOKEN - 1 or the first
......
...@@ -1410,22 +1410,7 @@ my_build_string (len, str) ...@@ -1410,22 +1410,7 @@ my_build_string (len, str)
return a_string; return a_string;
} }
/* Return a newly constructed OBJC_STRING_CST node whose value is /* Given a chain of STRING_CST's, build a static instance of
the LEN characters at STR.
The TREE_TYPE is not initialized. */
tree
build_objc_string (len, str)
int len;
const char *str;
{
tree s = build_string (len, str);
TREE_SET_CODE (s, OBJC_STRING_CST);
return s;
}
/* Given a chain of OBJC_STRING_CST's, build a static instance of
NXConstanString which points at the concatenation of those strings. NXConstanString which points at the concatenation of those strings.
We place the string object in the __string_objects section of the We place the string object in the __string_objects section of the
__OBJC segment. The Objective-C runtime will initialize the isa __OBJC segment. The Objective-C runtime will initialize the isa
...@@ -1451,7 +1436,6 @@ build_objc_string_object (strings) ...@@ -1451,7 +1436,6 @@ build_objc_string_object (strings)
add_class_reference (constant_string_id); add_class_reference (constant_string_id);
/* Combine_strings will work for OBJC_STRING_CST's too. */
string = combine_strings (strings); string = combine_strings (strings);
TREE_SET_CODE (string, STRING_CST); TREE_SET_CODE (string, STRING_CST);
length = TREE_STRING_LENGTH (string) - 1; length = TREE_STRING_LENGTH (string) - 1;
......
...@@ -32,6 +32,3 @@ DEFTREECODE (PROTOCOL_INTERFACE_TYPE, "protocol_interface_type", 't', 0) ...@@ -32,6 +32,3 @@ DEFTREECODE (PROTOCOL_INTERFACE_TYPE, "protocol_interface_type", 't', 0)
DEFTREECODE (KEYWORD_DECL, "keyword_decl", 'd', 0) DEFTREECODE (KEYWORD_DECL, "keyword_decl", 'd', 0)
DEFTREECODE (INSTANCE_METHOD_DECL, "instance_method_decl", 'd', 0) DEFTREECODE (INSTANCE_METHOD_DECL, "instance_method_decl", 'd', 0)
DEFTREECODE (CLASS_METHOD_DECL, "class_method_decl", 'd', 0) DEFTREECODE (CLASS_METHOD_DECL, "class_method_decl", 'd', 0)
/* Objective-C constants. */
DEFTREECODE (OBJC_STRING_CST, "objc_string_cst", 'c', 3)
2000-08-03 Zack Weinberg <zack@wolery.cumb.org>
* gcc.dg/cpp/20000625-2.c: Don't expect a warning on line 4.
Thu Aug 3 01:46:33 2000 Jeffrey A Law (law@cygnus.com) Thu Aug 3 01:46:33 2000 Jeffrey A Law (law@cygnus.com)
* gcc.c-torture/compile/20000803-1.c: New test. * gcc.c-torture/compile/20000803-1.c: New test.
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
/* { dg-do run } */ /* { dg-do run } */
#define symbol_version(name, version) name##@##version #define symbol_version(name, version) name##@##version
/* { dg-warning "nothing can be pasted" "" { target *-*-* } 4 } */
#define str(x) xstr(x) #define str(x) xstr(x)
#define xstr(x) #x #define xstr(x) #x
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment