This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: make grokfield handle locations
On Thu, Aug 21, 2008 at 10:21:01AM -0600, Tom Tromey wrote:
> >>>>> "Aldy" == Aldy Hernandez <aldyh@redhat.com> writes:
>
> Aldy> * gcc.dg/cpp/pr28165.c: Same.
> Aldy> * gcc.dg/cpp/paste15.c: Same.
> Aldy> * gcc.dg/cpp/trad/assert2.c: Same.
>
> Aldy> Sorry to keep bothering everyone with this, but it turns out all the
> Aldy> CPP tests I mention print out incorrect column information for at least
> Aldy> one of the errors being tested-- some of them bizarrely so.
>
> FYI, I looked at these.
>
> I fixed paste15 and assert2. I will fix up the test cases and check
> in my patch after regtesting, and after yours goes in (I'll need the
> dg fix).
>
> The pr28165 case is funny because the tokens come from a string. At
> first glance libcpp is not set up to handle this gracefully. I'll dig
> a bit more.
Sorry, I was fixing a small buglet that showed up on another test run after
updating my tree.
Below is the revision I have just committed.
Notice the default behavior I changed on cpp/cpp.exp and
cpp/trad/trad.exp.
Thanks for looking into the CPP issues!
Aldy
* c-tree.h (grokfield): New argument.
* c-decl.c (grokfield): Handle new location argument.
* c-parser.c (c_parser_struct_declaration): Pass location to
grokfield.
testsuite/
* gcc.dg/20011008-1.c: Test column.
* gcc.dg/20080820.c: New.
* gcc.dg/fltconst-1.c: Test column.
* gcc.dg/cpp/cpp.exp: Add -fno-show-column.
* gcc.dg/cpp/trad/trad.exp: Same.
* lib/gcc.exp (gcc_target_compile): Remove -fno-show-column.
* lib/gcc-dg.exp (process-message): Handle columns.
Index: testsuite/gcc.dg/fltconst-1.c
===================================================================
--- testsuite/gcc.dg/fltconst-1.c (revision 139386)
+++ testsuite/gcc.dg/fltconst-1.c (working copy)
@@ -1,16 +1,16 @@
/* { dg-do compile } */
/* { dg-options "-std=gnu99" } */
-double a = 1.ld; /* { dg-error "invalid suffix" } */
-double b = 1.fd; /* { dg-error "invalid suffix" } */
-double c = 1.di; /* { dg-error "invalid suffix" } */
-double d = 1.dj; /* { dg-error "invalid suffix" } */
-double e = 1.id; /* { dg-error "invalid suffix" } */
-double f = 1.jd; /* { dg-error "invalid suffix" } */
-double g = 1.ddd; /* { dg-error "invalid suffix" } */
-double h = 1.ldd; /* { dg-error "invalid suffix" } */
-double i = 1.dld; /* { dg-error "invalid suffix" } */
-double j = 1.ddl; /* { dg-error "invalid suffix" } */
-double k = 1.fdd; /* { dg-error "invalid suffix" } */
-double l = 1.dfd; /* { dg-error "invalid suffix" } */
-double m = 1.ddf; /* { dg-error "invalid suffix" } */
+double a = 1.ld; /* { dg-error "12:invalid suffix" } */
+double b = 1.fd; /* { dg-error "12:invalid suffix" } */
+double c = 1.di; /* { dg-error "12:invalid suffix" } */
+double d = 1.dj; /* { dg-error "12:invalid suffix" } */
+double e = 1.id; /* { dg-error "12:invalid suffix" } */
+double f = 1.jd; /* { dg-error "12:invalid suffix" } */
+double g = 1.ddd; /* { dg-error "12:invalid suffix" } */
+double h = 1.ldd; /* { dg-error "12:invalid suffix" } */
+double i = 1.dld; /* { dg-error "12:invalid suffix" } */
+double j = 1.ddl; /* { dg-error "12:invalid suffix" } */
+double k = 1.fdd; /* { dg-error "12:invalid suffix" } */
+double l = 1.dfd; /* { dg-error "12:invalid suffix" } */
+double m = 1.ddf; /* { dg-error "12:invalid suffix" } */
Index: testsuite/gcc.dg/20011008-1.c
===================================================================
--- testsuite/gcc.dg/20011008-1.c (revision 139386)
+++ testsuite/gcc.dg/20011008-1.c (working copy)
@@ -1,7 +1,7 @@
/* { dg-do compile } */
-/* { dg-options "-O0" } */
+/* { dg-options "-O0 -fshow-column" } */
-struct { int; int q; } a; /* { dg-warning "does not declare anything" } */
+struct { int; int q; } a; /* { dg-warning "13:does not declare anything" } */
struct { union {int x;}; int q; } b;
struct { struct {int x;}; int q; } c;
union { union {int x;}; int q; } d;
Index: testsuite/gcc.dg/cpp/cpp.exp
===================================================================
--- testsuite/gcc.dg/cpp/cpp.exp (revision 139386)
+++ testsuite/gcc.dg/cpp/cpp.exp (working copy)
@@ -37,7 +37,7 @@ dg-init
# Main loop.
dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.{c,S} ]] \
- "" $DEFAULT_CFLAGS
+ "-fno-show-column" $DEFAULT_CFLAGS
# All done.
dg-finish
Index: testsuite/gcc.dg/cpp/trad/trad.exp
===================================================================
--- testsuite/gcc.dg/cpp/trad/trad.exp (revision 139386)
+++ testsuite/gcc.dg/cpp/trad/trad.exp (working copy)
@@ -37,7 +37,7 @@ dg-init
# Main loop.
dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cS\]]] \
- "" $DEFAULT_TRADCPPFLAGS
+ "-fno-show-column" $DEFAULT_TRADCPPFLAGS
# All done.
dg-finish
Index: testsuite/gcc.dg/20080820.c
===================================================================
--- testsuite/gcc.dg/20080820.c (revision 0)
+++ testsuite/gcc.dg/20080820.c (revision 0)
@@ -0,0 +1,4 @@
+/* { dg-do compile } */
+/* { dg-options "-fshow-column -fms-extensions -pedantic" } */
+
+struct { struct a { int x; }; int bar; } hot; /* { dg-warning "29:ISO C doesn't support unnamed" } */
Index: testsuite/lib/gcc.exp
===================================================================
--- testsuite/lib/gcc.exp (revision 139386)
+++ testsuite/lib/gcc.exp (working copy)
@@ -150,7 +150,6 @@ proc gcc_target_compile { source dest ty
if [target_info exists gcc,timeout] {
lappend options "timeout=[target_info gcc,timeout]"
}
- lappend options "additional_flags=-fno-show-column"
lappend options "compiler=$GCC_UNDER_TEST"
set options [dg-additional-files-options $options $source]
return [target_compile $source $dest $type $options]
Index: testsuite/lib/gcc-dg.exp
===================================================================
--- testsuite/lib/gcc-dg.exp (revision 139386)
+++ testsuite/lib/gcc-dg.exp (working copy)
@@ -636,7 +636,18 @@ proc process-message { msgproc msgprefix
# it match a single line.
set newentry [lindex ${dg-messages} end]
set expmsg [lindex $newentry 2]
- set expmsg "$msgprefix\[^\n]*$expmsg"
+
+ # If we have a column...
+ if [regexp "^(\[0-9\]+):" $expmsg "" column] {
+ # Remove "COLUMN:"
+ regsub "^\[0-9\]+:" $expmsg "" expmsg
+
+ # Include the column in the search expression.
+ set expmsg "$column: $msgprefix\[^\n]*$expmsg"
+ } else {
+ set expmsg "$msgprefix\[^\n]*$expmsg"
+ }
+
set newentry [lreplace $newentry 2 2 $expmsg]
set dg-messages [lreplace ${dg-messages} end end $newentry]
verbose "process-message:\n${dg-messages}" 2
Index: c-tree.h
===================================================================
--- c-tree.h (revision 139386)
+++ c-tree.h (working copy)
@@ -475,8 +475,8 @@ extern tree finish_enum (tree, tree, tre
extern void finish_function (void);
extern tree finish_struct (tree, tree, tree);
extern struct c_arg_info *get_parm_info (bool);
-extern tree grokfield (struct c_declarator *, struct c_declspecs *,
- tree, tree *);
+extern tree grokfield (location_t, struct c_declarator *,
+ struct c_declspecs *, tree, tree *);
extern tree groktypename (struct c_type_name *);
extern tree grokparm (const struct c_parm *);
extern tree implicitly_declare (tree);
Index: c-decl.c
===================================================================
--- c-decl.c (revision 139386)
+++ c-decl.c (working copy)
@@ -5363,12 +5363,15 @@ start_struct (enum tree_code code, tree
WIDTH is non-NULL for bit-fields only, and is an INTEGER_CST node.
DECL_ATTRS is as for grokdeclarator.
+ LOC is the location of the structure component.
+
This is done during the parsing of the struct declaration.
The FIELD_DECL nodes are chained together and the lot of them
are ultimately passed to `build_struct' to make the RECORD_TYPE node. */
tree
-grokfield (struct c_declarator *declarator, struct c_declspecs *declspecs,
+grokfield (location_t loc,
+ struct c_declarator *declarator, struct c_declspecs *declspecs,
tree width, tree *decl_attrs)
{
tree value;
@@ -5414,10 +5417,10 @@ grokfield (struct c_declarator *declarat
}
if (!ok)
{
- pedwarn (input_location, 0, "declaration does not declare anything");
+ pedwarn (loc, 0, "declaration does not declare anything");
return NULL_TREE;
}
- pedwarn (input_location, OPT_pedantic, "ISO C doesn%'t support unnamed structs/unions");
+ pedwarn (loc, OPT_pedantic, "ISO C doesn%'t support unnamed structs/unions");
}
value = grokdeclarator (declarator, declspecs, FIELD, false,
Index: c-parser.c
===================================================================
--- c-parser.c (revision 139386)
+++ c-parser.c (working copy)
@@ -1960,7 +1960,9 @@ c_parser_struct_declaration (c_parser *p
structs or unions (which is [a] useful and [b] supports
MS P-SDK). */
tree attrs = NULL;
- ret = grokfield (build_id_declarator (NULL_TREE), specs,
+
+ ret = grokfield (c_parser_peek_token (parser)->location,
+ build_id_declarator (NULL_TREE), specs,
NULL_TREE, &attrs);
if (ret)
decl_attributes (&ret, attrs, 0);
@@ -2003,7 +2005,8 @@ c_parser_struct_declaration (c_parser *p
}
if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
postfix_attrs = c_parser_attributes (parser);
- d = grokfield (declarator, specs, width, &all_prefix_attrs);
+ d = grokfield (c_parser_peek_token (parser)->location,
+ declarator, specs, width, &all_prefix_attrs);
decl_attributes (&d, chainon (postfix_attrs,
all_prefix_attrs), 0);
TREE_CHAIN (d) = decls;