Commit 98c3a782 by Joseph Myers Committed by Joseph Myers

c-tree.h (enum c_typespec_keyword): New.

	* c-tree.h (enum c_typespec_keyword): New.
	(struct c_declspecs): Adjust description of "type".  Remove
	specbits, explicit_int_p and explicit_char_p.  Rename
	typedef_signed_p to explicit_signed_p.  Add default_int_p, long_p,
	short_p, signed_p, unsigned_p and complex_p.
	(finish_declspecs): New.
	* c-parse.in (datadef, datadecl, setspecs, decl, component_decl,
	typename): Call finish_declspecs.
	* c-decl.c (finish_declspecs): New.
	(declspecs_add_type): Check for combinations which cannot occur in
	valid specifier lists.  Update comments.
	(shadow_tag_warned): Remove checks done in finish_declspecs.
	Don't report useless type name if type defaulted to int.
	(grokdeclarator): Remove checks and actions done in
	finish_declspecs.  Don't allow for type being NULL.  Update for
	datastructures changes.  Initialize decl_attr.
	(build_null_declspecs, quals_from_declspecs): Update for
	datastructures changes.

testsuite:
	* gcc.dg/declspec-4.c, gcc.dg/declspec-5.c, gcc.dg/declspec-6.c:
	Update expected messages.
	* gcc.dg/declspec-13.c: New test.

From-SVN: r87660
parent 254ea84c
2004-09-17 Joseph S. Myers <jsm@polyomino.org.uk>
* c-tree.h (enum c_typespec_keyword): New.
(struct c_declspecs): Adjust description of "type". Remove
specbits, explicit_int_p and explicit_char_p. Rename
typedef_signed_p to explicit_signed_p. Add default_int_p, long_p,
short_p, signed_p, unsigned_p and complex_p.
(finish_declspecs): New.
* c-parse.in (datadef, datadecl, setspecs, decl, component_decl,
typename): Call finish_declspecs.
* c-decl.c (finish_declspecs): New.
(declspecs_add_type): Check for combinations which cannot occur in
valid specifier lists. Update comments.
(shadow_tag_warned): Remove checks done in finish_declspecs.
Don't report useless type name if type defaulted to int.
(grokdeclarator): Remove checks and actions done in
finish_declspecs. Don't allow for type being NULL. Update for
datastructures changes. Initialize decl_attr.
(build_null_declspecs, quals_from_declspecs): Update for
datastructures changes.
2004-09-17 Sylvain Pion <Sylvain.Pion@sophia.inria.fr>
* doc/extend.texi: Fix duplicated word.
......
......@@ -420,7 +420,7 @@ datadef:
| declspecs_ts setspecs initdecls ';'
{ POP_DECLSPEC_STACK; }
| declspecs ';'
{ shadow_tag ($1); }
{ shadow_tag (finish_declspecs ($1)); }
| error ';'
| error '}'
| ';'
......@@ -835,7 +835,7 @@ datadecl:
| declspecs_nots_nosa setspecs notype_initdecls ';'
{ POP_DECLSPEC_STACK; }
| declspecs_ts_nosa ';'
{ shadow_tag_warned ($1, 1);
{ shadow_tag_warned (finish_declspecs ($1), 1);
pedwarn ("empty declaration"); }
| declspecs_nots_nosa ';'
{ pedwarn ("empty declaration"); }
......@@ -868,6 +868,7 @@ setspecs: /* empty */
prefix_attributes = NULL_TREE;
current_declspecs = build_null_declspecs ();
}
current_declspecs = finish_declspecs (current_declspecs);
all_prefix_attributes = prefix_attributes; }
;
......@@ -888,7 +889,7 @@ decl:
| declspecs_nots setspecs notype_nested_function
{ POP_DECLSPEC_STACK; }
| declspecs ';'
{ shadow_tag ($1); }
{ shadow_tag (finish_declspecs ($1)); }
| extension decl
{ RESTORE_EXT_FLAGS ($1); }
;
......@@ -1745,7 +1746,7 @@ component_decl:
| declspecs_nosc_nots
{ if (pedantic)
pedwarn ("ISO C forbids member declarations with no members");
shadow_tag_warned ($1, pedantic);
shadow_tag_warned (finish_declspecs ($1), pedantic);
$$ = NULL_TREE; }
| error
{ $$ = NULL_TREE; }
......@@ -1823,7 +1824,7 @@ enumerator:
typename:
declspecs_nosc
{ pending_xref_error ();
$<dsptype>$ = $1; }
$<dsptype>$ = finish_declspecs ($1); }
absdcl
{ $$ = XOBNEW (&parser_obstack, struct c_type_name);
$$->specs = $<dsptype>2;
......
......@@ -141,10 +141,24 @@ enum c_storage_class {
csc_typedef
};
/* A type specifier keyword "void", "_Bool", "char", "int", "float",
"double", or none of these. */
enum c_typespec_keyword {
cts_none,
cts_void,
cts_bool,
cts_char,
cts_int,
cts_float,
cts_double
};
/* A sequence of declaration specifiers in C. */
struct c_declspecs {
/* The type specified, not reflecting modifiers such as "short" and
"unsigned", or NULL_TREE if none. */
/* The type specified, if a single type specifier such as a struct,
union or enum specifier, typedef name or typeof specifies the
whole type, or NULL_TREE if none or a keyword such as "void" or
"char" is used. Does not include qualifiers. */
tree type;
/* The attributes from a typedef decl. */
tree decl_attr;
......@@ -152,8 +166,9 @@ struct c_declspecs {
NULL; attributes (possibly from multiple lists) will be passed
separately. */
tree attrs;
/* The modifier bits present. */
int specbits;
/* Any type specifier keyword used such as "int", not reflecting
modifiers such as "short", or cts_none if none. */
enum c_typespec_keyword typespec_word;
/* The storage class specifier, or csc_none if none. */
enum c_storage_class storage_class;
/* Whether something other than a storage class specifier or
......@@ -165,17 +180,26 @@ struct c_declspecs {
BOOL_BITFIELD non_sc_seen_p : 1;
/* Whether the type is specified by a typedef. */
BOOL_BITFIELD typedef_p : 1;
/* Whether the type is specified by a typedef whose type is
explicitly "signed". */
BOOL_BITFIELD typedef_signed_p : 1;
/* Whether the type is explicitly "signed" or specified by a typedef
whose type is explicitly "signed". */
BOOL_BITFIELD explicit_signed_p : 1;
/* Whether the specifiers include a deprecated typedef. */
BOOL_BITFIELD deprecated_p : 1;
/* Whether "int" was explicitly specified. */
BOOL_BITFIELD explicit_int_p : 1;
/* Whether "char" was explicitly specified. */
BOOL_BITFIELD explicit_char_p : 1;
/* Whether the type defaulted to "int" because there were no type
specifiers. */
BOOL_BITFIELD default_int_p;
/* Whether "long" was specified. */
BOOL_BITFIELD long_p : 1;
/* Whether "long" was specified more than once. */
BOOL_BITFIELD long_long_p : 1;
/* Whether "short" was specified. */
BOOL_BITFIELD short_p : 1;
/* Whether "signed" was specified. */
BOOL_BITFIELD signed_p : 1;
/* Whether "unsigned" was specified. */
BOOL_BITFIELD unsigned_p : 1;
/* Whether "complex" was specified. */
BOOL_BITFIELD complex_p : 1;
/* Whether "inline" was specified. */
BOOL_BITFIELD inline_p : 1;
/* Whether "__thread" was specified. */
......@@ -362,6 +386,7 @@ extern struct c_declspecs *declspecs_add_qual (struct c_declspecs *, tree);
extern struct c_declspecs *declspecs_add_type (struct c_declspecs *, tree);
extern struct c_declspecs *declspecs_add_scspec (struct c_declspecs *, tree);
extern struct c_declspecs *declspecs_add_attrs (struct c_declspecs *, tree);
extern struct c_declspecs *finish_declspecs (struct c_declspecs *);
/* in c-objc-common.c */
extern int c_disregard_inline_limits (tree);
......
2004-09-17 Joseph S. Myers <jsm@polyomino.org.uk>
* gcc.dg/declspec-4.c, gcc.dg/declspec-5.c, gcc.dg/declspec-6.c:
Update expected messages.
* gcc.dg/declspec-13.c: New test.
2004-09-17 David Edelsohn <edelsohn@gnu.org>
* gcc.dg/darwin-longlong.c: XFAIL on AIX and SPE.
......
/* Test declaration specifiers. Test messages for bad type
specifiers. */
/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
/* { dg-do compile } */
/* { dg-options "-std=gnu89 -pedantic" } */
/* typeof should act much like typedef, so the following are
invalid. */
typeof(double) long x0; /* { dg-error "error: two or more data types in declaration specifiers" } */
typeof(double) _Complex x1; /* { dg-error "error: two or more data types in declaration specifiers" } */
/* The following is erroneous, and used to get a bogus message about
complex integer types. */
typedef double D;
D _Complex x2; /* { dg-error "error: two or more data types in declaration specifiers" } */
/* The following empty declarations should have problems in their type
specifiers diagnosed, not just the general problem that they are
empty declarations. */
long short; /* { dg-error "error: both 'long' and 'short' in declaration specifiers" } */
/* { dg-warning "warning: useless type name in empty declaration" "empty" { target *-*-* } 20 } */
_Complex double; /* { dg-warning "warning: ISO C90 does not support complex types" } */
/* { dg-warning "warning: useless type name in empty declaration" "empty" { target *-*-* } 22 } */
_Complex; /* { dg-warning "warning: ISO C90 does not support complex types" } */
/* { dg-warning "warning: ISO C does not support plain 'complex' meaning 'double complex'" "ISO C" { target *-*-* } 24 } */
/* { dg-warning "warning: useless type name in empty declaration" "empty" { target *-*-* } 24 } */
_Complex int; /* { dg-warning "warning: ISO C90 does not support complex types" } */
/* { dg-warning "warning: ISO C does not support complex integer types" "ISO C" { target *-*-* } 27 } */
/* { dg-warning "warning: useless type name in empty declaration" "empty" { target *-*-* } 27 } */
/* Specific messages for each invalid combination. (That some message
is given when appropriate for a larger collection of combinations
of type specifiers is tested in *typespec*.c.) */
long double long x3; /* { dg-error "both 'long long' and 'double' in declaration specifiers" } */
short long x4; /* { dg-error "both 'long' and 'short' in declaration specifiers" } */
void long x5; /* { dg-error "both 'long' and 'void' in declaration specifiers" } */
_Bool long x6; /* { dg-error "both 'long' and '_Bool' in declaration specifiers" } */
char long x7; /* { dg-error "both 'long' and 'char' in declaration specifiers" } */
float long x8; /* { dg-error "both 'long' and 'float' in declaration specifiers" } */
long short x9; /* { dg-error "both 'long' and 'short' in declaration specifiers" } */
void short x10; /* { dg-error "both 'short' and 'void' in declaration specifiers" } */
_Bool short x11; /* { dg-error "both 'short' and '_Bool' in declaration specifiers" } */
char short x12; /* { dg-error "both 'short' and 'char' in declaration specifiers" } */
float short x13; /* { dg-error "both 'short' and 'float' in declaration specifiers" } */
double short x14; /* { dg-error "both 'short' and 'double' in declaration specifiers" } */
unsigned signed x15; /* { dg-error "both 'signed' and 'unsigned' in declaration specifiers" } */
void signed x16; /* { dg-error "both 'signed' and 'void' in declaration specifiers" } */
_Bool signed x17; /* { dg-error "both 'signed' and '_Bool' in declaration specifiers" } */
float signed x18; /* { dg-error "both 'signed' and 'float' in declaration specifiers" } */
double signed x19; /* { dg-error "both 'signed' and 'double' in declaration specifiers" } */
signed unsigned x20; /* { dg-error "both 'signed' and 'unsigned' in declaration specifiers" } */
void unsigned x21; /* { dg-error "both 'unsigned' and 'void' in declaration specifiers" } */
_Bool unsigned x22; /* { dg-error "both 'unsigned' and '_Bool' in declaration specifiers" } */
float unsigned x23; /* { dg-error "both 'unsigned' and 'float' in declaration specifiers" } */
double unsigned x24; /* { dg-error "both 'unsigned' and 'double' in declaration specifiers" } */
void _Complex x25; /* { dg-error "both 'complex' and 'void' in declaration specifiers" } */
/* { dg-warning "warning: ISO C90 does not support complex types" "C90" { target *-*-* } 57 } */
_Bool _Complex x26; /* { dg-error "both 'complex' and '_Bool' in declaration specifiers" } */
/* { dg-warning "warning: ISO C90 does not support complex types" "C90" { target *-*-* } 59 } */
long void x27; /* { dg-error "both 'long' and 'void' in declaration specifiers" } */
short void x28; /* { dg-error "both 'short' and 'void' in declaration specifiers" } */
signed void x29; /* { dg-error "both 'signed' and 'void' in declaration specifiers" } */
unsigned void x30; /* { dg-error "both 'unsigned' and 'void' in declaration specifiers" } */
_Complex void x31; /* { dg-error "both 'complex' and 'void' in declaration specifiers" } */
/* { dg-warning "warning: ISO C90 does not support complex types" "C90" { target *-*-* } 66 } */
/* { dg-warning "warning: ISO C does not support plain 'complex' meaning 'double complex'" "complex" { target *-*-* } 66 } */
long _Bool x32; /* { dg-error "both 'long' and '_Bool' in declaration specifiers" } */
short _Bool x33; /* { dg-error "both 'short' and '_Bool' in declaration specifiers" } */
signed _Bool x34; /* { dg-error "both 'signed' and '_Bool' in declaration specifiers" } */
unsigned _Bool x35; /* { dg-error "both 'unsigned' and '_Bool' in declaration specifiers" } */
_Complex _Bool x36; /* { dg-error "both 'complex' and '_Bool' in declaration specifiers" } */
/* { dg-warning "warning: ISO C90 does not support complex types" "C90" { target *-*-* } 73 } */
/* { dg-warning "warning: ISO C does not support plain 'complex' meaning 'double complex'" "complex" { target *-*-* } 73 } */
long char x37; /* { dg-error "both 'long' and 'char' in declaration specifiers" } */
short char x38; /* { dg-error "both 'short' and 'char' in declaration specifiers" } */
long float x39; /* { dg-error "both 'long' and 'float' in declaration specifiers" } */
short float x40; /* { dg-error "both 'short' and 'float' in declaration specifiers" } */
signed float x41; /* { dg-error "both 'signed' and 'float' in declaration specifiers" } */
unsigned float x42; /* { dg-error "both 'unsigned' and 'float' in declaration specifiers" } */
long long double x43; /* { dg-error "both 'long long' and 'double' in declaration specifiers" } */
/* { dg-warning "warning: ISO C90 does not support 'long long'" "C90" { target *-*-* } 82 } */
short double x44; /* { dg-error "both 'short' and 'double' in declaration specifiers" } */
signed double x45; /* { dg-error "both 'signed' and 'double' in declaration specifiers" } */
unsigned double x46; /* { dg-error "both 'unsigned' and 'double' in declaration specifiers" } */
......@@ -19,23 +19,25 @@ enum e1 { E1 };
/* Not declaring anything (pedwarns). */
struct { int a; }; /* { dg-warning "warning: unnamed struct/union that defines no instances" } */
int; /* { dg-warning "warning: useless type name in empty declaration" } */
long; /* { dg-warning "warning: useless keyword or type name in empty declaration" } */
/* { dg-warning "warning: empty declaration" "long" { target *-*-* } 22 } */
long; /* { dg-warning "warning: useless type name in empty declaration" } */
T; /* { dg-warning "warning: useless type name in empty declaration" } */
static const; /* { dg-warning "warning: useless storage class specifier in empty declaration" } */
/* { dg-warning "warning: empty declaration" "long" { target *-*-* } 25 } */
/* { dg-warning "warning: empty declaration" "static const" { target *-*-* } 24 } */
union { long b; }; /* { dg-warning "warning: unnamed struct/union that defines no instances" } */
/* Multiple type names (errors). */
struct s1 int; /* { dg-error "error: two or more data types in declaration specifiers" } */
char union u1; /* { dg-error "error: two or more data types in declaration specifiers" } */
/* { dg-warning "warning: useless type name in empty declaration" "char union" { target *-*-* } 31 } */
/* { dg-warning "warning: useless type name in empty declaration" "char union" { target *-*-* } 30 } */
double enum { E2 }; /* { dg-error "error: two or more data types in declaration specifiers" } */
/* { dg-warning "warning: useless type name in empty declaration" "double enum" { target *-*-* } 33 } */
/* { dg-warning "warning: useless type name in empty declaration" "double enum" { target *-*-* } 32 } */
T struct s2; /* { dg-error "error: two or more data types in declaration specifiers" } */
/* { dg-warning "warning: useless type name in empty declaration" "T struct" { target *-*-* } 35 } */
long union u2; /* { dg-error "error: long, short, signed, unsigned or complex used invalidly in empty declaration" } */
struct s3 short; /* { dg-error "error: long, short, signed, unsigned or complex used invalidly in empty declaration" } */
union u3 signed; /* { dg-error "error: long, short, signed, unsigned or complex used invalidly in empty declaration" } */
unsigned struct s4; /* { dg-error "error: long, short, signed, unsigned or complex used invalidly in empty declaration" } */
_Complex enum { E3 }; /* { dg-error "error: long, short, signed, unsigned or complex used invalidly in empty declaration" } */
/* { dg-warning "warning: useless type name in empty declaration" "T struct" { target *-*-* } 34 } */
long union u2; /* { dg-error "error: two or more data types in declaration specifiers" } */
/* { dg-warning "warning: useless type name in empty declaration" "empty" { target *-*-* } 36 } */
struct s3 short; /* { dg-error "error: two or more data types in declaration specifiers" } */
union u3 signed; /* { dg-error "error: two or more data types in declaration specifiers" } */
unsigned struct s4; /* { dg-error "error: two or more data types in declaration specifiers" } */
/* { dg-warning "warning: useless type name in empty declaration" "empty" { target *-*-* } 40 } */
_Complex enum { E3 }; /* { dg-error "error: two or more data types in declaration specifiers" } */
/* { dg-warning "warning: useless type name in empty declaration" "empty" { target *-*-* } 42 } */
......@@ -19,23 +19,27 @@ enum e1 { E1 };
/* Not declaring anything (pedwarns). */
struct { int a; }; /* { dg-warning "warning: unnamed struct/union that defines no instances" } */
int; /* { dg-warning "warning: useless type name in empty declaration" } */
long; /* { dg-warning "warning: useless keyword or type name in empty declaration" } */
/* { dg-warning "warning: empty declaration" "long" { target *-*-* } 22 } */
long; /* { dg-warning "warning: useless type name in empty declaration" } */
T; /* { dg-warning "warning: useless type name in empty declaration" } */
static const; /* { dg-warning "warning: useless storage class specifier in empty declaration" } */
/* { dg-warning "warning: empty declaration" "long" { target *-*-* } 25 } */
/* { dg-warning "warning: empty declaration" "static const" { target *-*-* } 24 } */
union { long b; }; /* { dg-warning "warning: unnamed struct/union that defines no instances" } */
/* Multiple type names (errors). */
struct s1 int; /* { dg-error "error: two or more data types in declaration specifiers" } */
char union u1; /* { dg-error "error: two or more data types in declaration specifiers" } */
/* { dg-warning "warning: useless type name in empty declaration" "char union" { target *-*-* } 31 } */
/* { dg-warning "warning: useless type name in empty declaration" "char union" { target *-*-* } 30 } */
double enum { E2 }; /* { dg-error "error: two or more data types in declaration specifiers" } */
/* { dg-warning "warning: useless type name in empty declaration" "double enum" { target *-*-* } 33 } */
/* { dg-warning "warning: useless type name in empty declaration" "double enum" { target *-*-* } 32 } */
T struct s2; /* { dg-error "error: two or more data types in declaration specifiers" } */
/* { dg-warning "warning: useless type name in empty declaration" "T struct" { target *-*-* } 35 } */
long union u2; /* { dg-error "error: long, short, signed, unsigned or complex used invalidly in empty declaration" } */
struct s3 short; /* { dg-error "error: long, short, signed, unsigned or complex used invalidly in empty declaration" } */
union u3 signed; /* { dg-error "error: long, short, signed, unsigned or complex used invalidly in empty declaration" } */
unsigned struct s4; /* { dg-error "error: long, short, signed, unsigned or complex used invalidly in empty declaration" } */
_Complex enum { E3 }; /* { dg-error "error: long, short, signed, unsigned or complex used invalidly in empty declaration" } */
/* { dg-warning "warning: useless type name in empty declaration" "T struct" { target *-*-* } 34 } */
long union u2; /* { dg-error "error: two or more data types in declaration specifiers" } */
/* { dg-warning "warning: useless type name in empty declaration" "empty" { target *-*-* } 36 } */
struct s3 short; /* { dg-error "error: two or more data types in declaration specifiers" } */
union u3 signed; /* { dg-error "error: two or more data types in declaration specifiers" } */
unsigned struct s4; /* { dg-error "error: two or more data types in declaration specifiers" } */
/* { dg-warning "warning: useless type name in empty declaration" "empty" { target *-*-* } 40 } */
_Complex enum { E3 }; /* { dg-error "error: two or more data types in declaration specifiers" } */
/* { dg-warning "warning: useless type name in empty declaration" "empty" { target *-*-* } 42 } */
/* { dg-warning "warning: ISO C90 does not support complex types" "C90" { target *-*-* } 42 } */
/* { dg-warning "warning: ISO C does not support plain 'complex' meaning 'double complex'" "ISO C" { target *-*-* } 42 } */
......@@ -19,23 +19,27 @@ enum e1 { E1 };
/* Not declaring anything (pedwarns). */
struct { int a; }; /* { dg-error "error: unnamed struct/union that defines no instances" } */
int; /* { dg-error "error: useless type name in empty declaration" } */
long; /* { dg-warning "warning: useless keyword or type name in empty declaration" } */
/* { dg-error "error: empty declaration" "long" { target *-*-* } 22 } */
long; /* { dg-error "error: useless type name in empty declaration" } */
T; /* { dg-error "error: useless type name in empty declaration" } */
static const; /* { dg-warning "warning: useless storage class specifier in empty declaration" } */
/* { dg-error "error: empty declaration" "long" { target *-*-* } 25 } */
/* { dg-error "error: empty declaration" "static const" { target *-*-* } 24 } */
union { long b; }; /* { dg-error "error: unnamed struct/union that defines no instances" } */
/* Multiple type names (errors). */
struct s1 int; /* { dg-error "error: two or more data types in declaration specifiers" } */
char union u1; /* { dg-error "error: two or more data types in declaration specifiers" } */
/* { dg-error "error: useless type name in empty declaration" "char union" { target *-*-* } 31 } */
/* { dg-error "error: useless type name in empty declaration" "char union" { target *-*-* } 30 } */
double enum { E2 }; /* { dg-error "error: two or more data types in declaration specifiers" } */
/* { dg-error "error: useless type name in empty declaration" "double enum" { target *-*-* } 33 } */
/* { dg-error "error: useless type name in empty declaration" "double enum" { target *-*-* } 32 } */
T struct s2; /* { dg-error "error: two or more data types in declaration specifiers" } */
/* { dg-error "error: useless type name in empty declaration" "T struct" { target *-*-* } 35 } */
long union u2; /* { dg-error "error: long, short, signed, unsigned or complex used invalidly in empty declaration" } */
struct s3 short; /* { dg-error "error: long, short, signed, unsigned or complex used invalidly in empty declaration" } */
union u3 signed; /* { dg-error "error: long, short, signed, unsigned or complex used invalidly in empty declaration" } */
unsigned struct s4; /* { dg-error "error: long, short, signed, unsigned or complex used invalidly in empty declaration" } */
_Complex enum { E3 }; /* { dg-error "error: long, short, signed, unsigned or complex used invalidly in empty declaration" } */
/* { dg-error "error: useless type name in empty declaration" "T struct" { target *-*-* } 34 } */
long union u2; /* { dg-error "error: two or more data types in declaration specifiers" } */
/* { dg-error "error: useless type name in empty declaration" "empty" { target *-*-* } 36 } */
struct s3 short; /* { dg-error "error: two or more data types in declaration specifiers" } */
union u3 signed; /* { dg-error "error: two or more data types in declaration specifiers" } */
unsigned struct s4; /* { dg-error "error: two or more data types in declaration specifiers" } */
/* { dg-error "error: useless type name in empty declaration" "empty" { target *-*-* } 40 } */
_Complex enum { E3 }; /* { dg-error "error: two or more data types in declaration specifiers" } */
/* { dg-error "error: useless type name in empty declaration" "empty" { target *-*-* } 42 } */
/* { dg-error "error: ISO C90 does not support complex types" "C90" { target *-*-* } 42 } */
/* { dg-error "error: ISO C does not support plain 'complex' meaning 'double complex'" "ISO C" { target *-*-* } 42 } */
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