From: Paolo Carlini <paolo.carlini@oracle.com>
To: "gcc-patches@gcc.gnu.org" <gcc-patches@gcc.gnu.org>
Cc: Jason Merrill <jason@redhat.com>
Subject: [C++ Patch] Three additional bitfield diagnostic tweaks (a regression fix included)
Date: Thu, 06 Dec 2018 10:52:00 -0000 [thread overview]
Message-ID: <f9ea299f-5867-a6be-56e1-88024dd9e428@oracle.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 719 bytes --]
Hi,
I'm bundling together 3 more. In attachment order:
1- Since we decided to explicitly print the wrong type, I suppose we
want to consistently do that in templates too.
2- Unfortunately I have to fix another buglet I recently introduced,
completely similar to c++/88222 fixed by Marek. Well, at least we will
not print anymore an empty '' when the unqualified_id is null because
the field is unnamed.
3- In the non-static case too, when from grokdeclarator we are calling
FIELD_DECL and passing the location as first argument, I think we want
to likewise pass declarator->id_loc when available.
The added/extended testcase exercise all of the above. Tested x86_64-linux.
Thanks, Paolo.
////////////////
[-- Attachment #2: CL_grokbitfield2 --]
[-- Type: text/plain, Size: 555 bytes --]
/cp
2018-12-06 Paolo Carlini <paolo.carlini@oracle.com>
* class.c (check_bitfield_decl): In error message about non-integral
type print the type itself too.
* decl.c (grokdeclarator): Do not ICE on unnamed bit-fields declared
friends; when calling build_decl for a FIELD_DECL possibly pass the
declarator->id_loc.
/testsuite
2018-12-06 Paolo Carlini <paolo.carlini@oracle.com>
* g++.dg/parse/bitfield7.C: New.
* g++.dg/other/bitfield2.C: Check location and type.
* g++.dg/parse/bitfield1.C: Likewise.
* g++.dg/parse/bitfield2.C: Likewise.
[-- Attachment #3: patch_grokbitfield2 --]
[-- Type: text/plain, Size: 3739 bytes --]
Index: cp/class.c
===================================================================
--- cp/class.c (revision 266840)
+++ cp/class.c (working copy)
@@ -3218,7 +3218,8 @@ check_bitfield_decl (tree field)
/* Detect invalid bit-field type. */
if (!INTEGRAL_OR_ENUMERATION_TYPE_P (type))
{
- error ("bit-field %q+#D with non-integral type", field);
+ error_at (DECL_SOURCE_LOCATION (field),
+ "bit-field %q#D with non-integral type %qT", field, type);
w = error_mark_node;
}
else
Index: cp/decl.c
===================================================================
--- cp/decl.c (revision 266840)
+++ cp/decl.c (working copy)
@@ -12446,9 +12446,13 @@ grokdeclarator (const cp_declarator *declarator,
{
if (friendp)
{
- error_at (declarator->id_loc,
- "%qE is neither function nor member function; "
- "cannot be declared friend", unqualified_id);
+ if (unqualified_id && declarator)
+ error_at (declarator->id_loc,
+ "%qE is neither function nor member function; "
+ "cannot be declared friend", unqualified_id);
+ else
+ error ("unnamed field is neither function nor member "
+ "function; cannot be declared friend");
return error_mark_node;
}
decl = NULL_TREE;
@@ -12536,7 +12540,9 @@ grokdeclarator (const cp_declarator *declarator,
unqualified_id);
constexpr_p = false;
}
- decl = build_decl (input_location,
+ decl = build_decl (declarator
+ ? declarator->id_loc
+ : input_location,
FIELD_DECL, unqualified_id, type);
DECL_NONADDRESSABLE_P (decl) = bitfield;
if (bitfield && !unqualified_id)
Index: testsuite/g++.dg/other/bitfield2.C
===================================================================
--- testsuite/g++.dg/other/bitfield2.C (revision 266840)
+++ testsuite/g++.dg/other/bitfield2.C (working copy)
@@ -3,7 +3,7 @@
struct A
{
- double d : 2; // { dg-error "non-integral" }
+ double d : 2; // { dg-error "10:bit-field .d. with non-integral type .double." }
A() {}
~A() {}
};
Index: testsuite/g++.dg/parse/bitfield1.C
===================================================================
--- testsuite/g++.dg/parse/bitfield1.C (revision 266840)
+++ testsuite/g++.dg/parse/bitfield1.C (working copy)
@@ -2,7 +2,7 @@
struct A
{
- double i : 8; // { dg-error "type" }
+ double i : 8; // { dg-error "10:bit-field .i. with non-integral type .double." }
};
void foo(A& a)
Index: testsuite/g++.dg/parse/bitfield2.C
===================================================================
--- testsuite/g++.dg/parse/bitfield2.C (revision 266840)
+++ testsuite/g++.dg/parse/bitfield2.C (working copy)
@@ -4,7 +4,7 @@ struct X {};
struct A
{
- X x : 2; // { dg-error "non-integral type" }
+ X x : 2; // { dg-error "7:bit-field .x. with non-integral type .X." }
};
struct B : A {};
@@ -19,7 +19,7 @@ C<int> c;
template <typename T>
struct D
{
- T t : 3; // { dg-error "non-integral type" }
+ T t : 3; // { dg-error "5:bit-field .double D\\<double\\>::t. with non-integral type .double." }
};
D<double> d; // { dg-message "required" }
@@ -28,7 +28,7 @@ template <typename T>
struct E
{
typedef T* U;
- U t : 3; // { dg-error "non-integral type" }
+ U t : 3; // { dg-error "5:bit-field .t. with non-integral type .E\\<T\\>::U." }
};
E<double> e;
Index: testsuite/g++.dg/parse/bitfield7.C
===================================================================
--- testsuite/g++.dg/parse/bitfield7.C (nonexistent)
+++ testsuite/g++.dg/parse/bitfield7.C (working copy)
@@ -0,0 +1,4 @@
+struct A
+{
+ friend int : 1; // { dg-error "unnamed field" }
+};
next reply other threads:[~2018-12-06 10:52 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-12-06 10:52 Paolo Carlini [this message]
2018-12-06 15:11 ` Jason Merrill
2018-12-06 17:23 ` Paolo Carlini
2018-12-06 19:38 ` Jason Merrill
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=f9ea299f-5867-a6be-56e1-88024dd9e428@oracle.com \
--to=paolo.carlini@oracle.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=jason@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).