diff options
author | Jozef Lawrynowicz <jozef.l@mittosystems.com> | 2019-06-25 09:41:17 +0000 |
---|---|---|
committer | Jozef Lawrynowicz <jozefl@gcc.gnu.org> | 2019-06-25 09:41:17 +0000 |
commit | 5e5803060c3d6db3ff73195db798ffd8e5588e78 (patch) | |
tree | fda90c008ced20c186f8f9f0ce033275edfd0dd4 /gcc | |
parent | a7e8a463cd1dbaccf6e7c4fa888768fcd257a30f (diff) | |
download | gcc-5e5803060c3d6db3ff73195db798ffd8e5588e78.zip gcc-5e5803060c3d6db3ff73195db798ffd8e5588e78.tar.gz gcc-5e5803060c3d6db3ff73195db798ffd8e5588e78.tar.bz2 |
Implement alternate "__intN__" form of "__intN" type
gcc/ChangeLog:
* gcc/c-family/c-common.c (c_common_nodes_and_builtins): Define
alternate "__intN__" name for "__intN" types.
* gcc/c/c-parser.c (c_parse_init): Create keyword for "__intN__" type.
* gcc/cp/lex.c (init_reswords): Likewise.
* gcc/config/msp430/msp430.h: Use __int20__ for SIZE_TYPE and
PTRDIFF_TYPE.
* gcc/cp/cp-tree.h (cp_decl_specifier_seq): New bitfield "int_n_alt".
* gcc/c/c-decl.c (declspecs_add_type): Don't pedwarn about "__intN" ISO
C incompatibility if alternate "__intN__" form is used.
* gcc/cp/decl.c (grokdeclarator): Likewise.
* gcc/cp/parser.c (cp_parser_simple_type_specifier): Set
decl_specs->int_n_alt if "__intN__" form is used.
* gcc/gimple-ssa-sprintf.c (build_intmax_type_nodes): Accept "__intN__"
format of "__intN" types for UINTMAX_TYPE.
* gcc/brig/brig-lang.c (brig_build_c_type_nodes): Accept "__intN__"
format of "__intN" types for SIZE_TYPE.
* gcc/lto/lto-lang.c (lto_build_c_type_nodes): Likewise.
* gcc/stor-layout.c (initialize_sizetypes): Accept "__intN__"
format of "__intN" types for SIZETYPE.
* gcc/tree.c (build_common_tree_nodes): Accept "__intN__"
format of "__intN" types for SIZE_TYPE and PTRDIFF_TYPE.
* gcc/doc/invoke.texi: Document that __intN__ disables pedantic
warnings.
gcc/testsuite/ChangeLog:
* gcc.target/msp430/mlarge-pedwarns.c: New test.
From-SVN: r272640
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 26 | ||||
-rw-r--r-- | gcc/brig/brig-lang.c | 6 | ||||
-rw-r--r-- | gcc/c-family/c-common.c | 6 | ||||
-rw-r--r-- | gcc/c/c-decl.c | 6 | ||||
-rw-r--r-- | gcc/c/c-parser.c | 5 | ||||
-rw-r--r-- | gcc/config/msp430/msp430.h | 6 | ||||
-rw-r--r-- | gcc/cp/cp-tree.h | 3 | ||||
-rw-r--r-- | gcc/cp/decl.c | 6 | ||||
-rw-r--r-- | gcc/cp/lex.c | 5 | ||||
-rw-r--r-- | gcc/cp/parser.c | 6 | ||||
-rw-r--r-- | gcc/doc/invoke.texi | 6 | ||||
-rw-r--r-- | gcc/gimple-ssa-sprintf.c | 6 | ||||
-rw-r--r-- | gcc/lto/lto-lang.c | 6 | ||||
-rw-r--r-- | gcc/stor-layout.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/msp430/mlarge-pedwarns.c | 11 | ||||
-rw-r--r-- | gcc/tree.c | 13 |
17 files changed, 109 insertions, 18 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f14b826..1fa1c2f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,29 @@ +2019-06-25 Jozef Lawrynowicz <jozef.l@mittosystems.com> + + * gcc/c-family/c-common.c (c_common_nodes_and_builtins): Define + alternate "__intN__" name for "__intN" types. + * gcc/c/c-parser.c (c_parse_init): Create keyword for "__intN__" type. + * gcc/cp/lex.c (init_reswords): Likewise. + * gcc/config/msp430/msp430.h: Use __int20__ for SIZE_TYPE and + PTRDIFF_TYPE. + * gcc/cp/cp-tree.h (cp_decl_specifier_seq): New bitfield "int_n_alt". + * gcc/c/c-decl.c (declspecs_add_type): Don't pedwarn about "__intN" ISO + C incompatibility if alternate "__intN__" form is used. + * gcc/cp/decl.c (grokdeclarator): Likewise. + * gcc/cp/parser.c (cp_parser_simple_type_specifier): Set + decl_specs->int_n_alt if "__intN__" form is used. + * gcc/gimple-ssa-sprintf.c (build_intmax_type_nodes): Accept "__intN__" + format of "__intN" types for UINTMAX_TYPE. + * gcc/brig/brig-lang.c (brig_build_c_type_nodes): Accept "__intN__" + format of "__intN" types for SIZE_TYPE. + * gcc/lto/lto-lang.c (lto_build_c_type_nodes): Likewise. + * gcc/stor-layout.c (initialize_sizetypes): Accept "__intN__" + format of "__intN" types for SIZETYPE. + * gcc/tree.c (build_common_tree_nodes): Accept "__intN__" + format of "__intN" types for SIZE_TYPE and PTRDIFF_TYPE. + * gcc/doc/invoke.texi: Document that __intN__ disables pedantic + warnings. + 2019-06-25 Jan Hubicka <jh@suse.cz> * tree-ssa-alias.c (indirect_ref_may_alias_decl_p): Check that diff --git a/gcc/brig/brig-lang.c b/gcc/brig/brig-lang.c index 91c7cfa..1c3a3b0 100644 --- a/gcc/brig/brig-lang.c +++ b/gcc/brig/brig-lang.c @@ -864,10 +864,12 @@ brig_build_c_type_nodes (void) for (i = 0; i < NUM_INT_N_ENTS; i++) if (int_n_enabled_p[i]) { - char name[50]; + char name[50], altname[50]; sprintf (name, "__int%d unsigned", int_n_data[i].bitsize); + sprintf (altname, "__int%d__ unsigned", int_n_data[i].bitsize); - if (strcmp (name, SIZE_TYPE) == 0) + if (strcmp (name, SIZE_TYPE) == 0 + || strcmp (altname, SIZE_TYPE) == 0) { intmax_type_node = int_n_trees[i].signed_type; uintmax_type_node = int_n_trees[i].unsigned_type; diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index 6013fca..da4aadb 100644 --- a/gcc/c-family/c-common.c +++ b/gcc/c-family/c-common.c @@ -4024,8 +4024,14 @@ c_common_nodes_and_builtins (void) sprintf (name, "__int%d", int_n_data[i].bitsize); record_builtin_type ((enum rid)(RID_FIRST_INT_N + i), name, int_n_trees[i].signed_type); + sprintf (name, "__int%d__", int_n_data[i].bitsize); + record_builtin_type ((enum rid)(RID_FIRST_INT_N + i), name, + int_n_trees[i].signed_type); + sprintf (name, "__int%d unsigned", int_n_data[i].bitsize); record_builtin_type (RID_MAX, name, int_n_trees[i].unsigned_type); + sprintf (name, "__int%d__ unsigned", int_n_data[i].bitsize); + record_builtin_type (RID_MAX, name, int_n_trees[i].unsigned_type); } if (c_dialect_cxx ()) diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c index 87ce853..cb2f49f 100644 --- a/gcc/c/c-decl.c +++ b/gcc/c/c-decl.c @@ -10637,7 +10637,11 @@ declspecs_add_type (location_t loc, struct c_declspecs *specs, case RID_INT_N_2: case RID_INT_N_3: specs->int_n_idx = i - RID_INT_N_0; - if (!in_system_header_at (input_location)) + if (!in_system_header_at (input_location) + /* If the INT_N type ends in "__", and so is of the format + "__intN__", don't pedwarn. */ + && (strncmp (IDENTIFIER_POINTER (type) + + (IDENTIFIER_LENGTH (type) - 2), "__", 2) != 0)) pedwarn (loc, OPT_Wpedantic, "ISO C does not support %<__int%d%> types", int_n_data[specs->int_n_idx].bitsize); diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c index df1a304..9850872 100644 --- a/gcc/c/c-parser.c +++ b/gcc/c/c-parser.c @@ -157,6 +157,11 @@ c_parse_init (void) id = get_identifier (name); C_SET_RID_CODE (id, RID_FIRST_INT_N + i); C_IS_RESERVED_WORD (id) = 1; + + sprintf (name, "__int%d__", int_n_data[i].bitsize); + id = get_identifier (name); + C_SET_RID_CODE (id, RID_FIRST_INT_N + i); + C_IS_RESERVED_WORD (id) = 1; } } diff --git a/gcc/config/msp430/msp430.h b/gcc/config/msp430/msp430.h index c0aa8ea..1288b1a 100644 --- a/gcc/config/msp430/msp430.h +++ b/gcc/config/msp430/msp430.h @@ -185,9 +185,11 @@ extern const char * msp430_select_hwmult_lib (int, const char **); /* Layout of Source Language Data Types */ #undef SIZE_TYPE -#define SIZE_TYPE (TARGET_LARGE ? "__int20 unsigned" : "unsigned int") +#define SIZE_TYPE (TARGET_LARGE \ + ? "__int20__ unsigned" \ + : "unsigned int") #undef PTRDIFF_TYPE -#define PTRDIFF_TYPE (TARGET_LARGE ? "__int20" : "int") +#define PTRDIFF_TYPE (TARGET_LARGE ? "__int20__" : "int") #undef WCHAR_TYPE #define WCHAR_TYPE "long int" #undef WCHAR_TYPE_SIZE diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index bf47f67..d42be75 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -5866,6 +5866,9 @@ struct cp_decl_specifier_seq { BOOL_BITFIELD gnu_thread_keyword_p : 1; /* True iff the type is a decltype. */ BOOL_BITFIELD decltype_p : 1; + /* True iff the alternate "__intN__" form of the __intN type has been + used. */ + BOOL_BITFIELD int_n_alt: 1; }; /* The various kinds of declarators. */ diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 5d49535..96cd484 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -10368,6 +10368,7 @@ grokdeclarator (const cp_declarator *declarator, tree type = NULL_TREE; int longlong = 0; int explicit_intN = 0; + int int_n_alt = 0; int virtualp, explicitp, friendp, inlinep, staticp; int explicit_int = 0; int explicit_char = 0; @@ -10441,6 +10442,7 @@ grokdeclarator (const cp_declarator *declarator, long_p = decl_spec_seq_has_spec_p (declspecs, ds_long); longlong = decl_spec_seq_has_spec_p (declspecs, ds_long_long); explicit_intN = declspecs->explicit_intN_p; + int_n_alt = declspecs->int_n_alt; thread_p = decl_spec_seq_has_spec_p (declspecs, ds_thread); // Was concept_p specified? Note that ds_concept @@ -10843,7 +10845,9 @@ grokdeclarator (const cp_declarator *declarator, int_n_data[declspecs->int_n_idx].bitsize); explicit_intN = false; } - else if (pedantic && ! in_system_header_at (input_location)) + /* Don't pedwarn if the alternate "__intN__" form has been used instead + of "__intN". */ + else if (!int_n_alt && pedantic && ! in_system_header_at (input_location)) pedwarn (input_location, OPT_Wpedantic, "ISO C++ does not support %<__int%d%> for %qs", int_n_data[declspecs->int_n_idx].bitsize, name); diff --git a/gcc/cp/lex.c b/gcc/cp/lex.c index 4a4325f..5bfb1e5 100644 --- a/gcc/cp/lex.c +++ b/gcc/cp/lex.c @@ -262,6 +262,11 @@ init_reswords (void) id = get_identifier (name); C_SET_RID_CODE (id, RID_FIRST_INT_N + i); set_identifier_kind (id, cik_keyword); + + sprintf (name, "__int%d__", int_n_data[i].bitsize); + id = get_identifier (name); + C_SET_RID_CODE (id, RID_FIRST_INT_N + i); + set_identifier_kind (id, cik_keyword); } } diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index e9bdfab..4d46cb3 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -17622,6 +17622,12 @@ cp_parser_simple_type_specifier (cp_parser* parser, { decl_specs->explicit_intN_p = true; decl_specs->int_n_idx = idx; + /* Check if the alternate "__intN__" form has been used instead of + "__intN". */ + if (strncmp (IDENTIFIER_POINTER (token->u.value) + + (IDENTIFIER_LENGTH (token->u.value) - 2), + "__", 2) == 0) + decl_specs->int_n_alt = true; } type = int_n_trees [idx].signed_type; break; diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 4f93c7e..7c09680 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -4337,8 +4337,10 @@ without this option, certain GNU extensions and traditional C and C++ features are supported as well. With this option, they are rejected. @option{-Wpedantic} does not cause warning messages for use of the -alternate keywords whose names begin and end with @samp{__}. Pedantic -warnings are also disabled in the expression that follows +alternate keywords whose names begin and end with @samp{__}. This alternate +format can also be used to disable warnings for non-ISO @samp{__intN} types, +i.e. @samp{__intN__}. +Pedantic warnings are also disabled in the expression that follows @code{__extension__}. However, only system header files should use these escape routes; application programs should avoid them. @xref{Alternate Keywords}. diff --git a/gcc/gimple-ssa-sprintf.c b/gcc/gimple-ssa-sprintf.c index 80b0bf8..a0934bc 100644 --- a/gcc/gimple-ssa-sprintf.c +++ b/gcc/gimple-ssa-sprintf.c @@ -1019,10 +1019,12 @@ build_intmax_type_nodes (tree *pintmax, tree *puintmax) for (int i = 0; i < NUM_INT_N_ENTS; i++) if (int_n_enabled_p[i]) { - char name[50]; + char name[50], altname[50]; sprintf (name, "__int%d unsigned", int_n_data[i].bitsize); + sprintf (altname, "__int%d__ unsigned", int_n_data[i].bitsize); - if (strcmp (name, UINTMAX_TYPE) == 0) + if (strcmp (name, UINTMAX_TYPE) == 0 + || strcmp (altname, UINTMAX_TYPE) == 0) { *pintmax = int_n_trees[i].signed_type; *puintmax = int_n_trees[i].unsigned_type; diff --git a/gcc/lto/lto-lang.c b/gcc/lto/lto-lang.c index e155ea3..cc44afc 100644 --- a/gcc/lto/lto-lang.c +++ b/gcc/lto/lto-lang.c @@ -1259,10 +1259,12 @@ lto_build_c_type_nodes (void) for (i = 0; i < NUM_INT_N_ENTS; i++) if (int_n_enabled_p[i]) { - char name[50]; + char name[50], altname[50]; sprintf (name, "__int%d unsigned", int_n_data[i].bitsize); + sprintf (altname, "__int%d__ unsigned", int_n_data[i].bitsize); - if (strcmp (name, SIZE_TYPE) == 0) + if (strcmp (name, SIZE_TYPE) == 0 + || strcmp (altname, SIZE_TYPE) == 0) { intmax_type_node = int_n_trees[i].signed_type; uintmax_type_node = int_n_trees[i].unsigned_type; diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c index 5d6f2e0..583516c 100644 --- a/gcc/stor-layout.c +++ b/gcc/stor-layout.c @@ -2716,10 +2716,12 @@ initialize_sizetypes (void) for (i = 0; i < NUM_INT_N_ENTS; i++) if (int_n_enabled_p[i]) { - char name[50]; + char name[50], altname[50]; sprintf (name, "__int%d unsigned", int_n_data[i].bitsize); + sprintf (altname, "__int%d__ unsigned", int_n_data[i].bitsize); - if (strcmp (name, SIZETYPE) == 0) + if (strcmp (name, SIZETYPE) == 0 + || strcmp (altname, SIZETYPE) == 0) { precision = int_n_data[i].bitsize; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ecfca8d..47542cc 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2019-06-25 Jozef Lawrynowicz <jozef.l@mittosystems.com> + + * gcc.target/msp430/mlarge-pedwarns.c: New test. + 2019-06-25 Jakub Jelinek <jakub@redhat.com> PR sanitizer/90954 diff --git a/gcc/testsuite/gcc.target/msp430/mlarge-pedwarns.c b/gcc/testsuite/gcc.target/msp430/mlarge-pedwarns.c new file mode 100644 index 0000000..a16f533 --- /dev/null +++ b/gcc/testsuite/gcc.target/msp430/mlarge-pedwarns.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-skip-if "" { "*-*-*" } { "-mcpu=msp430" } { "" } } */ +/* { dg-options "-mlarge -pedantic-errors" } */ + +/* Ensure the use of builtin macros that contain __int20__ in their + expansion don't cause ISO C errors when -pedantic-errors is passed. */ + +__SIZE_TYPE__ a; +__INTPTR_TYPE__ b; +__UINTPTR_TYPE__ c; +__PTRDIFF_TYPE__ d; @@ -10385,10 +10385,12 @@ build_common_tree_nodes (bool signed_char) for (i = 0; i < NUM_INT_N_ENTS; i++) if (int_n_enabled_p[i]) { - char name[50]; + char name[50], altname[50]; sprintf (name, "__int%d unsigned", int_n_data[i].bitsize); + sprintf (altname, "__int%d__ unsigned", int_n_data[i].bitsize); - if (strcmp (name, SIZE_TYPE) == 0) + if (strcmp (name, SIZE_TYPE) == 0 + || strcmp (altname, SIZE_TYPE) == 0) { size_type_node = int_n_trees[i].unsigned_type; } @@ -10412,9 +10414,12 @@ build_common_tree_nodes (bool signed_char) for (int i = 0; i < NUM_INT_N_ENTS; i++) if (int_n_enabled_p[i]) { - char name[50]; + char name[50], altname[50]; sprintf (name, "__int%d", int_n_data[i].bitsize); - if (strcmp (name, PTRDIFF_TYPE) == 0) + sprintf (altname, "__int%d__", int_n_data[i].bitsize); + + if (strcmp (name, PTRDIFF_TYPE) == 0 + || strcmp (altname, PTRDIFF_TYPE) == 0) ptrdiff_type_node = int_n_trees[i].signed_type; } if (ptrdiff_type_node == NULL_TREE) |