Commit a23c9413 by Neil Booth Committed by Neil Booth

c-lex.c, [...]: Revert concatenation changes.

	* c-lex.c, c-parse.in, c-typeck.c: Revert concatenation changes.
cp:
	* parse.y, semantics.c: Similarly.

From-SVN: r47848
parent d01f3474
2001-12-10 Neil Booth <neil@daikokuya.demon.co.uk>
* c-lex.c, c-parse.in, c-typeck.c: Revert concatenation changes.
Mon Dec 10 09:19:11 2001 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> Mon Dec 10 09:19:11 2001 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* config/i386/i386.md (leave, leave_rex64): Adjust pattern to match * config/i386/i386.md (leave, leave_rex64): Adjust pattern to match
......
...@@ -762,7 +762,6 @@ c_lex (value) ...@@ -762,7 +762,6 @@ c_lex (value)
tree *value; tree *value;
{ {
const cpp_token *tok; const cpp_token *tok;
enum cpp_ttype result;
retry: retry:
timevar_push (TV_CPP); timevar_push (TV_CPP);
...@@ -777,9 +776,7 @@ c_lex (value) ...@@ -777,9 +776,7 @@ c_lex (value)
lineno = src_lineno; lineno = src_lineno;
*value = NULL_TREE; *value = NULL_TREE;
result = tok->type; switch (tok->type)
switch (result)
{ {
case CPP_OPEN_BRACE: indent_level++; break; case CPP_OPEN_BRACE: indent_level++; break;
case CPP_CLOSE_BRACE: indent_level--; break; case CPP_CLOSE_BRACE: indent_level--; break;
...@@ -807,48 +804,8 @@ c_lex (value) ...@@ -807,48 +804,8 @@ c_lex (value)
case CPP_STRING: case CPP_STRING:
case CPP_WSTRING: case CPP_WSTRING:
{ *value = lex_string ((const char *)tok->val.str.text,
tree full_str = NULL_TREE; tok->val.str.len, tok->type == CPP_WSTRING);
do
{
/* Translate escape sequences in this string, then append it. */
tree str = lex_string ((const char *) tok->val.str.text,
tok->val.str.len,
tok->type == CPP_WSTRING);
if (full_str && c_language == clk_c && warn_traditional
&& !in_system_header)
{
static int last_lineno;
static const char *last_input_filename;
if (lineno != last_lineno || !last_input_filename
|| strcmp (last_input_filename, input_filename))
{
warning ("traditional C rejects string concatenation");
last_lineno = lineno;
last_input_filename = input_filename;
}
}
full_str = chainon (full_str, str);
/* Wide and non-wide give a wide result. */
if (tok->type == CPP_WSTRING)
result = CPP_WSTRING;
/* Look ahead for another string token. */
do
tok = cpp_get_token (parse_in);
while (tok->type == CPP_PADDING);
}
while (tok->type == CPP_STRING || tok->type == CPP_WSTRING);
_cpp_backup_tokens (parse_in, 1);
*value = combine_strings (full_str);
}
break; break;
/* These tokens should not be visible outside cpplib. */ /* These tokens should not be visible outside cpplib. */
...@@ -860,7 +817,7 @@ c_lex (value) ...@@ -860,7 +817,7 @@ c_lex (value)
default: break; default: break;
} }
return result; return tok->type;
} }
#define ERROR(msgid) do { error(msgid); goto syntax_error; } while(0) #define ERROR(msgid) do { error(msgid); goto syntax_error; } while(0)
......
...@@ -99,8 +99,9 @@ end ifobjc ...@@ -99,8 +99,9 @@ end ifobjc
yylval is the node for the constant. */ yylval is the node for the constant. */
%token CONSTANT %token CONSTANT
/* A STRING_CST with type an array of the appropriate character type. */ /* String constants in raw form.
%token STRING OBJC_STRING yylval is a STRING_CST node. */
%token STRING
/* "...", used for functions with variable arglists. */ /* "...", used for functions with variable arglists. */
%token ELLIPSIS %token ELLIPSIS
...@@ -150,7 +151,7 @@ end ifobjc ...@@ -150,7 +151,7 @@ end ifobjc
%type <ttype> BREAK CONTINUE RETURN GOTO ASM_KEYWORD SIZEOF TYPEOF ALIGNOF %type <ttype> BREAK CONTINUE RETURN GOTO ASM_KEYWORD SIZEOF TYPEOF ALIGNOF
%type <ttype> identifier IDENTIFIER TYPENAME CONSTANT expr nonnull_exprlist exprlist %type <ttype> identifier IDENTIFIER TYPENAME CONSTANT expr nonnull_exprlist exprlist
%type <ttype> expr_no_commas cast_expr unary_expr primary STRING %type <ttype> expr_no_commas cast_expr unary_expr primary string STRING
%type <ttype> declspecs_nosc_nots_nosa_noea declspecs_nosc_nots_nosa_ea %type <ttype> declspecs_nosc_nots_nosa_noea declspecs_nosc_nots_nosa_ea
%type <ttype> declspecs_nosc_nots_sa_noea declspecs_nosc_nots_sa_ea %type <ttype> declspecs_nosc_nots_sa_noea declspecs_nosc_nots_sa_ea
%type <ttype> declspecs_nosc_ts_nosa_noea declspecs_nosc_ts_nosa_ea %type <ttype> declspecs_nosc_ts_nosa_noea declspecs_nosc_ts_nosa_ea
...@@ -203,8 +204,6 @@ end ifobjc ...@@ -203,8 +204,6 @@ end ifobjc
%type <lineno> save_lineno %type <lineno> save_lineno
ifobjc ifobjc
%token OBJC_STRING
/* the Objective-C nonterminals */ /* the Objective-C nonterminals */
%type <ttype> ivar_decl_list ivar_decls ivar_decl ivars ivar_declarator %type <ttype> ivar_decl_list ivar_decls ivar_decl ivars ivar_declarator
...@@ -215,7 +214,7 @@ ifobjc ...@@ -215,7 +214,7 @@ ifobjc
%type <ttype> selectorarg keywordnamelist keywordname objcencodeexpr %type <ttype> selectorarg keywordnamelist keywordname objcencodeexpr
%type <ttype> objc_string non_empty_protocolrefs protocolrefs identifier_list objcprotocolexpr %type <ttype> objc_string non_empty_protocolrefs protocolrefs identifier_list objcprotocolexpr
%type <ttype> CLASSNAME OBJECTNAME OBJC_STRING %type <ttype> CLASSNAME OBJECTNAME
end ifobjc end ifobjc
%{ %{
...@@ -348,8 +347,14 @@ extdef: ...@@ -348,8 +347,14 @@ extdef:
ifobjc ifobjc
| objcdef | objcdef
end ifobjc end ifobjc
| ASM_KEYWORD '(' STRING ')' ';' | ASM_KEYWORD '(' expr ')' ';'
{ assemble_asm ($3); } { STRIP_NOPS ($3);
if ((TREE_CODE ($3) == ADDR_EXPR
&& TREE_CODE (TREE_OPERAND ($3, 0)) == STRING_CST)
|| TREE_CODE ($3) == STRING_CST)
assemble_asm ($3);
else
error ("argument of `asm' is not a constant string"); }
| extension extdef | extension extdef
{ RESTORE_WARN_FLAGS ($1); } { RESTORE_WARN_FLAGS ($1); }
; ;
...@@ -613,8 +618,8 @@ primary: ...@@ -613,8 +618,8 @@ primary:
$$ = build_external_ref ($1, yychar == '('); $$ = build_external_ref ($1, yychar == '(');
} }
| CONSTANT | CONSTANT
| STRING | string
{ $$ = $1; } { $$ = combine_strings ($1); }
| VAR_FUNC_NAME | VAR_FUNC_NAME
{ $$ = fname_decl (C_RID_CODE ($$), $$); } { $$ = fname_decl (C_RID_CODE ($$), $$); }
| '(' typename ')' '{' | '(' typename ')' '{'
...@@ -724,13 +729,37 @@ ifobjc ...@@ -724,13 +729,37 @@ ifobjc
end ifobjc end ifobjc
; ;
/* Produces a STRING_CST with perhaps more STRING_CSTs chained onto it. */
string:
STRING
| string STRING
{
ifc
static int last_lineno = 0;
static const char *last_input_filename = 0;
end ifc
$$ = chainon ($1, $2);
ifc
if (warn_traditional && !in_system_header
&& (lineno != last_lineno || !last_input_filename ||
strcmp (last_input_filename, input_filename)))
{
warning ("traditional C rejects string concatenation");
last_lineno = lineno;
last_input_filename = input_filename;
}
end ifc
}
;
ifobjc ifobjc
/* Chains ObjC string objects together. */ /* Produces an STRING_CST with perhaps more STRING_CSTs chained
onto it, which is to be read as an ObjC string object. */
objc_string: objc_string:
OBJC_STRING '@' STRING
{ $$ = $1; } { $$ = $2; }
| objc_string OBJC_STRING | objc_string '@' STRING
{ $$ = chainon ($1, $2); } { $$ = chainon ($1, $3); }
; ;
end ifobjc end ifobjc
...@@ -1363,8 +1392,10 @@ notype_initdecls: ...@@ -1363,8 +1392,10 @@ notype_initdecls:
maybeasm: maybeasm:
/* empty */ /* empty */
{ $$ = NULL_TREE; } { $$ = NULL_TREE; }
| ASM_KEYWORD '(' STRING ')' | ASM_KEYWORD '(' string ')'
{ $$ = $3; } { if (TREE_CHAIN ($3)) $3 = combine_strings ($3);
$$ = $3;
}
; ;
initdcl: initdcl:
...@@ -2320,20 +2351,20 @@ stmt: ...@@ -2320,20 +2351,20 @@ stmt:
| RETURN expr ';' | RETURN expr ';'
{ stmt_count++; { stmt_count++;
$$ = c_expand_return ($2); } $$ = c_expand_return ($2); }
| ASM_KEYWORD maybe_type_qual '(' STRING ')' ';' | ASM_KEYWORD maybe_type_qual '(' expr ')' ';'
{ stmt_count++; { stmt_count++;
$$ = simple_asm_stmt ($4); } $$ = simple_asm_stmt ($4); }
/* This is the case with just output operands. */ /* This is the case with just output operands. */
| ASM_KEYWORD maybe_type_qual '(' STRING ':' asm_operands ')' ';' | ASM_KEYWORD maybe_type_qual '(' expr ':' asm_operands ')' ';'
{ stmt_count++; { stmt_count++;
$$ = build_asm_stmt ($2, $4, $6, NULL_TREE, NULL_TREE); } $$ = build_asm_stmt ($2, $4, $6, NULL_TREE, NULL_TREE); }
/* This is the case with input operands as well. */ /* This is the case with input operands as well. */
| ASM_KEYWORD maybe_type_qual '(' STRING ':' asm_operands ':' | ASM_KEYWORD maybe_type_qual '(' expr ':' asm_operands ':'
asm_operands ')' ';' asm_operands ')' ';'
{ stmt_count++; { stmt_count++;
$$ = build_asm_stmt ($2, $4, $6, $8, NULL_TREE); } $$ = build_asm_stmt ($2, $4, $6, $8, NULL_TREE); }
/* This is the case with clobbered registers as well. */ /* This is the case with clobbered registers as well. */
| ASM_KEYWORD maybe_type_qual '(' STRING ':' asm_operands ':' | ASM_KEYWORD maybe_type_qual '(' expr ':' asm_operands ':'
asm_operands ':' asm_clobbers ')' ';' asm_operands ':' asm_clobbers ')' ';'
{ stmt_count++; { stmt_count++;
$$ = build_asm_stmt ($2, $4, $6, $8, $10); } $$ = build_asm_stmt ($2, $4, $6, $8, $10); }
...@@ -2422,10 +2453,10 @@ asm_operand: ...@@ -2422,10 +2453,10 @@ asm_operand:
; ;
asm_clobbers: asm_clobbers:
STRING string
{ $$ = tree_cons (NULL_TREE, $1, NULL_TREE); } { $$ = tree_cons (NULL_TREE, combine_strings ($1), NULL_TREE); }
| asm_clobbers ',' STRING | asm_clobbers ',' string
{ $$ = tree_cons (NULL_TREE, $3, $1); } { $$ = tree_cons (NULL_TREE, combine_strings ($3), $1); }
; ;
/* This is what appears inside the parens in a function declarator. /* This is what appears inside the parens in a function declarator.
...@@ -3572,8 +3603,7 @@ end ifobjc ...@@ -3572,8 +3603,7 @@ end ifobjc
to string constants. */ to string constants. */
const char *name = fname_string (rid_code); const char *name = fname_string (rid_code);
yylval.ttype yylval.ttype = build_string (strlen (name) + 1, name);
= combine_strings (build_string (strlen (name) + 1, name));
last_token = CPP_STRING; /* so yyerror won't choke */ last_token = CPP_STRING; /* so yyerror won't choke */
return STRING; return STRING;
} }
...@@ -3690,16 +3720,23 @@ _yylex () ...@@ -3690,16 +3720,23 @@ _yylex ()
special significance. */ special significance. */
case CPP_ATSIGN: case CPP_ATSIGN:
ifobjc ifobjc
last_token = c_lex (&yylval.ttype); {
tree after_at;
enum cpp_ttype after_at_type;
if (last_token == CPP_NAME after_at_type = c_lex (&after_at);
&& C_IS_RESERVED_WORD (yylval.ttype)
&& OBJC_IS_AT_KEYWORD (C_RID_CODE (yylval.ttype)))
return rid_to_yy [(int) C_RID_CODE (yylval.ttype)];
else if (last_token == CPP_STRING || last_token == CPP_WSTRING)
return OBJC_STRING;
/* Fall through... */ if (after_at_type == CPP_NAME
&& C_IS_RESERVED_WORD (after_at)
&& OBJC_IS_AT_KEYWORD (C_RID_CODE (after_at)))
{
yylval.ttype = after_at;
last_token = after_at_type;
return rid_to_yy [(int) C_RID_CODE (after_at)];
}
_cpp_backup_tokens (parse_in, 1);
return '@';
}
end ifobjc end ifobjc
/* These tokens are C++ specific (and will not be generated /* These tokens are C++ specific (and will not be generated
......
...@@ -6820,16 +6820,29 @@ process_init_element (value) ...@@ -6820,16 +6820,29 @@ process_init_element (value)
/* Build a simple asm-statement, from one string literal. */ /* Build a simple asm-statement, from one string literal. */
tree tree
simple_asm_stmt (string) simple_asm_stmt (expr)
tree string; tree expr;
{ {
STRIP_NOPS (expr);
if (TREE_CODE (expr) == ADDR_EXPR)
expr = TREE_OPERAND (expr, 0);
if (TREE_CODE (expr) == STRING_CST)
{
tree stmt; tree stmt;
stmt = add_stmt (build_stmt (ASM_STMT, NULL_TREE, string, if (TREE_CHAIN (expr))
expr = combine_strings (expr);
stmt = add_stmt (build_stmt (ASM_STMT, NULL_TREE, expr,
NULL_TREE, NULL_TREE, NULL_TREE, NULL_TREE,
NULL_TREE)); NULL_TREE));
ASM_INPUT_P (stmt) = 1; ASM_INPUT_P (stmt) = 1;
return stmt; return stmt;
}
error ("argument of `asm' is not a constant string");
return NULL_TREE;
} }
/* Build an asm-statement, whose components are a CV_QUALIFIER, a /* Build an asm-statement, whose components are a CV_QUALIFIER, a
...@@ -6845,6 +6858,14 @@ build_asm_stmt (cv_qualifier, string, outputs, inputs, clobbers) ...@@ -6845,6 +6858,14 @@ build_asm_stmt (cv_qualifier, string, outputs, inputs, clobbers)
{ {
tree tail; tree tail;
if (TREE_CHAIN (string))
string = combine_strings (string);
if (TREE_CODE (string) != STRING_CST)
{
error ("asm template is not a string constant");
return NULL_TREE;
}
if (cv_qualifier != NULL_TREE if (cv_qualifier != NULL_TREE
&& cv_qualifier != ridpointers[(int) RID_VOLATILE]) && cv_qualifier != ridpointers[(int) RID_VOLATILE])
{ {
......
2001-12-10 Neil Booth <neil@daikokuya.demon.co.uk>
* parse.y, semantics.c: Similarly.
2001-12-04 Nathan Sidwell <nathan@codesourcery.com> 2001-12-04 Nathan Sidwell <nathan@codesourcery.com>
PR g++/87 PR g++/87
......
...@@ -259,7 +259,8 @@ cp_parse_init () ...@@ -259,7 +259,8 @@ cp_parse_init ()
yylval contains an IDENTIFIER_NODE which indicates which one. */ yylval contains an IDENTIFIER_NODE which indicates which one. */
%token VAR_FUNC_NAME %token VAR_FUNC_NAME
/* String constants as arrays of a suitable type. */ /* String constants in raw form.
yylval is a STRING_CST node. */
%token STRING %token STRING
/* "...", used for functions with variable arglists. */ /* "...", used for functions with variable arglists. */
...@@ -328,7 +329,7 @@ cp_parse_init () ...@@ -328,7 +329,7 @@ cp_parse_init ()
%type <ttype> PFUNCNAME maybe_identifier %type <ttype> PFUNCNAME maybe_identifier
%type <ttype> paren_expr_or_null nontrivial_exprlist SELFNAME %type <ttype> paren_expr_or_null nontrivial_exprlist SELFNAME
%type <ttype> expr_no_commas expr_no_comma_rangle %type <ttype> expr_no_commas expr_no_comma_rangle
%type <ttype> cast_expr unary_expr primary STRING %type <ttype> cast_expr unary_expr primary string STRING
%type <ttype> reserved_declspecs boolean.literal %type <ttype> reserved_declspecs boolean.literal
%type <ttype> reserved_typespecquals %type <ttype> reserved_typespecquals
%type <ttype> SCSPEC TYPESPEC CV_QUALIFIER maybe_cv_qualifier %type <ttype> SCSPEC TYPESPEC CV_QUALIFIER maybe_cv_qualifier
...@@ -496,8 +497,9 @@ extdef: ...@@ -496,8 +497,9 @@ extdef:
{ do_pending_inlines (); } { do_pending_inlines (); }
| template_def | template_def
{ do_pending_inlines (); } { do_pending_inlines (); }
| asm_keyword '(' STRING ')' ';' | asm_keyword '(' string ')' ';'
{ assemble_asm ($3); } { if (TREE_CHAIN ($3)) $3 = combine_strings ($3);
assemble_asm ($3); }
| extern_lang_string '{' extdefs_opt '}' | extern_lang_string '{' extdefs_opt '}'
{ pop_lang_context (); } { pop_lang_context (); }
| extern_lang_string .hush_warning fndef .warning_ok eat_saved_input | extern_lang_string .hush_warning fndef .warning_ok eat_saved_input
...@@ -1545,8 +1547,9 @@ primary: ...@@ -1545,8 +1547,9 @@ primary:
} }
| CONSTANT | CONSTANT
| boolean.literal | boolean.literal
| STRING | string
{ {
$$ = combine_strings ($$);
/* combine_strings doesn't set up TYPE_MAIN_VARIANT of /* combine_strings doesn't set up TYPE_MAIN_VARIANT of
a const array the way we want, so fix it. */ a const array the way we want, so fix it. */
if (flag_const_strings) if (flag_const_strings)
...@@ -1748,6 +1751,13 @@ boolean.literal: ...@@ -1748,6 +1751,13 @@ boolean.literal:
{ $$ = boolean_false_node; } { $$ = boolean_false_node; }
; ;
/* Produces a STRING_CST with perhaps more STRING_CSTs chained onto it. */
string:
STRING
| string STRING
{ $$ = chainon ($$, $2); }
;
nodecls: nodecls:
/* empty */ /* empty */
{ {
...@@ -2031,8 +2041,8 @@ nomods_initdecls: ...@@ -2031,8 +2041,8 @@ nomods_initdecls:
maybeasm: maybeasm:
/* empty */ /* empty */
{ $$ = NULL_TREE; } { $$ = NULL_TREE; }
| asm_keyword '(' STRING ')' | asm_keyword '(' string ')'
{ $$ = $3; } { if (TREE_CHAIN ($3)) $3 = combine_strings ($3); $$ = $3; }
; ;
initdcl: initdcl:
...@@ -3429,27 +3439,27 @@ simple_stmt: ...@@ -3429,27 +3439,27 @@ simple_stmt:
{ $$ = finish_return_stmt (NULL_TREE); } { $$ = finish_return_stmt (NULL_TREE); }
| RETURN_KEYWORD expr ';' | RETURN_KEYWORD expr ';'
{ $$ = finish_return_stmt ($2); } { $$ = finish_return_stmt ($2); }
| asm_keyword maybe_cv_qualifier '(' STRING ')' ';' | asm_keyword maybe_cv_qualifier '(' string ')' ';'
{ $$ = finish_asm_stmt ($2, $4, NULL_TREE, NULL_TREE, { $$ = finish_asm_stmt ($2, $4, NULL_TREE, NULL_TREE,
NULL_TREE); NULL_TREE);
ASM_INPUT_P ($$) = 1; } ASM_INPUT_P ($$) = 1; }
/* This is the case with just output operands. */ /* This is the case with just output operands. */
| asm_keyword maybe_cv_qualifier '(' STRING ':' asm_operands ')' ';' | asm_keyword maybe_cv_qualifier '(' string ':' asm_operands ')' ';'
{ $$ = finish_asm_stmt ($2, $4, $6, NULL_TREE, NULL_TREE); } { $$ = finish_asm_stmt ($2, $4, $6, NULL_TREE, NULL_TREE); }
/* This is the case with input operands as well. */ /* This is the case with input operands as well. */
| asm_keyword maybe_cv_qualifier '(' STRING ':' asm_operands ':' | asm_keyword maybe_cv_qualifier '(' string ':' asm_operands ':'
asm_operands ')' ';' asm_operands ')' ';'
{ $$ = finish_asm_stmt ($2, $4, $6, $8, NULL_TREE); } { $$ = finish_asm_stmt ($2, $4, $6, $8, NULL_TREE); }
| asm_keyword maybe_cv_qualifier '(' STRING SCOPE asm_operands ')' ';' | asm_keyword maybe_cv_qualifier '(' string SCOPE asm_operands ')' ';'
{ $$ = finish_asm_stmt ($2, $4, NULL_TREE, $6, NULL_TREE); } { $$ = finish_asm_stmt ($2, $4, NULL_TREE, $6, NULL_TREE); }
/* This is the case with clobbered registers as well. */ /* This is the case with clobbered registers as well. */
| asm_keyword maybe_cv_qualifier '(' STRING ':' asm_operands ':' | asm_keyword maybe_cv_qualifier '(' string ':' asm_operands ':'
asm_operands ':' asm_clobbers ')' ';' asm_operands ':' asm_clobbers ')' ';'
{ $$ = finish_asm_stmt ($2, $4, $6, $8, $10); } { $$ = finish_asm_stmt ($2, $4, $6, $8, $10); }
| asm_keyword maybe_cv_qualifier '(' STRING SCOPE asm_operands ':' | asm_keyword maybe_cv_qualifier '(' string SCOPE asm_operands ':'
asm_clobbers ')' ';' asm_clobbers ')' ';'
{ $$ = finish_asm_stmt ($2, $4, NULL_TREE, $6, $8); } { $$ = finish_asm_stmt ($2, $4, NULL_TREE, $6, $8); }
| asm_keyword maybe_cv_qualifier '(' STRING ':' asm_operands SCOPE | asm_keyword maybe_cv_qualifier '(' string ':' asm_operands SCOPE
asm_clobbers ')' ';' asm_clobbers ')' ';'
{ $$ = finish_asm_stmt ($2, $4, $6, NULL_TREE, $8); } { $$ = finish_asm_stmt ($2, $4, $6, NULL_TREE, $8); }
| GOTO '*' expr ';' | GOTO '*' expr ';'
...@@ -3604,10 +3614,10 @@ asm_operand: ...@@ -3604,10 +3614,10 @@ asm_operand:
; ;
asm_clobbers: asm_clobbers:
STRING string
{ $$ = tree_cons (NULL_TREE, $1, NULL_TREE);} { $$ = tree_cons (NULL_TREE, combine_strings ($1), NULL_TREE);}
| asm_clobbers ',' STRING | asm_clobbers ',' string
{ $$ = tree_cons (NULL_TREE, $3, $1); } { $$ = tree_cons (NULL_TREE, combine_strings ($3), $1); }
; ;
/* This is what appears inside the parens in a function declarator. /* This is what appears inside the parens in a function declarator.
......
...@@ -883,6 +883,9 @@ finish_asm_stmt (cv_qualifier, string, output_operands, ...@@ -883,6 +883,9 @@ finish_asm_stmt (cv_qualifier, string, output_operands,
tree r; tree r;
tree t; tree t;
if (TREE_CHAIN (string))
string = combine_strings (string);
if (cv_qualifier != NULL_TREE if (cv_qualifier != NULL_TREE
&& cv_qualifier != ridpointers[(int) RID_VOLATILE]) && cv_qualifier != ridpointers[(int) RID_VOLATILE])
{ {
......
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