Hi,
these should be more or less straightforward (now that
DECL_SOURCE_LOCATION often extracts a proper location ;). In the case of
warn_if_not_aligned I also removed the redundant width check (it's never
null, double checked by running the instrumented testsuite too) and I
also removed the DECL_NAME use, which definitely doesn't play well with
unnamed declarations (other/bitfield7.C exercises that too).
Tested x86_64-linux, as usual.
Thanks, Paolo.
//////////////////////
/cp
2018-12-07 Paolo Carlini <paolo.carl...@oracle.com>
* decl2.c (grokbitfield): Use DECL_SOURCE_LOCATION in error messages
about bit-fields with function type, warn_if_not_aligned type, and
static bit-fields; avoid DECL_NAME for unnamed declarations.
/testsuite
2018-12-07 Paolo Carlini <paolo.carl...@oracle.com>
* g++.dg/other/bitfield7.C: New.
* g++.dg/parse/bitfield8.C: Likewise.
* g++.dg/parse/bitfield9.C: Likewise.
* g++.dg/pr53037-4.C: Test the locations too.
Index: cp/decl2.c
===================================================================
--- cp/decl2.c (revision 266884)
+++ cp/decl2.c (working copy)
@@ -1046,15 +1046,15 @@ grokbitfield (const cp_declarator *declarator,
check here. */
if (TREE_CODE (value) == FUNCTION_DECL)
{
- error ("cannot declare bit-field %qD with function type",
- DECL_NAME (value));
+ error_at (DECL_SOURCE_LOCATION (value),
+ "cannot declare bit-field %qD with function type", value);
return NULL_TREE;
}
- if (width && TYPE_WARN_IF_NOT_ALIGN (type))
+ if (TYPE_WARN_IF_NOT_ALIGN (type))
{
- error ("cannot declare bit-field %qD with %<warn_if_not_aligned%> type",
- DECL_NAME (value));
+ error_at (DECL_SOURCE_LOCATION (value), "cannot declare bit-field "
+ "%qD with %<warn_if_not_aligned%> type", value);
return NULL_TREE;
}
@@ -1067,7 +1067,8 @@ grokbitfield (const cp_declarator *declarator,
if (TREE_STATIC (value))
{
- error ("static member %qD cannot be a bit-field", value);
+ error_at (DECL_SOURCE_LOCATION (value),
+ "static member %qD cannot be a bit-field", value);
return NULL_TREE;
}
Index: testsuite/g++.dg/other/bitfield7.C
===================================================================
--- testsuite/g++.dg/other/bitfield7.C (nonexistent)
+++ testsuite/g++.dg/other/bitfield7.C (working copy)
@@ -0,0 +1,7 @@
+typedef int __attribute__((warn_if_not_aligned(8))) intwna;
+
+struct S
+{
+ intwna : 2; // { dg-error "cannot declare bit-field" }
+ intwna i : 2; // { dg-error "10:cannot declare bit-field .i." }
+};
Index: testsuite/g++.dg/parse/bitfield8.C
===================================================================
--- testsuite/g++.dg/parse/bitfield8.C (nonexistent)
+++ testsuite/g++.dg/parse/bitfield8.C (working copy)
@@ -0,0 +1,4 @@
+struct A
+{
+ static int a : 1; // { dg-error "14:static member .a. cannot be a
bit-field" }
+};
Index: testsuite/g++.dg/parse/bitfield9.C
===================================================================
--- testsuite/g++.dg/parse/bitfield9.C (nonexistent)
+++ testsuite/g++.dg/parse/bitfield9.C (working copy)
@@ -0,0 +1,6 @@
+template<typename T>
+struct A
+{
+ typedef T type();
+ type i : 2; // { dg-error "8:cannot declare bit-field" }
+};
Index: testsuite/g++.dg/pr53037-4.C
===================================================================
--- testsuite/g++.dg/pr53037-4.C (revision 266884)
+++ testsuite/g++.dg/pr53037-4.C (working copy)
@@ -12,7 +12,7 @@ foo2 (void) /* { dg-error "'warn_if_not_aligned' m
struct foo3
{
- int i : 2 __attribute__((warn_if_not_aligned(8))); /* { dg-error
"'warn_if_not_aligned' may not be specified for 'i'" } */
+ int i : 2 __attribute__((warn_if_not_aligned(8))); /* { dg-error
"7:'warn_if_not_aligned' may not be specified for 'i'" } */
};
typedef unsigned int __u32
@@ -20,5 +20,5 @@ typedef unsigned int __u32
struct foo4
{
- __u32 i : 2; /* { dg-error "cannot declare bit-field 'i' with
'warn_if_not_aligned' type" } */
+ __u32 i : 2; /* { dg-error "9:cannot declare bit-field 'i' with
'warn_if_not_aligned' type" } */
};