Message ID | 4DF8B2CF.7070401@gjlay.de |
---|---|
State | New |
Headers | show |
On Wed, Jun 15, 2011 at 3:54 PM, Georg-Johann Lay <avr@gjlay.de> wrote: > Weddington, Eric schrieb: >> Hi Johann, >> >> I understand your reasoning, but I'm not particularly fond of this hack. > > Yes, ACK. It's a hack to get rid of the PR. > >> Surely there's a way to fix this correctly without relying on this hack... > > Surely, gcc is man-made ;-) Someone will have to dive into C++ FE/parser. Well, doing this error handling at attribute parsing time is going to be fragile. I suggest to move it to code emission time instead (there currently isn't a target hook for when the frontend finished a variable declaration). Richard. > Johann > >> >> Eric Weddington >> >>> -----Original Message----- >>> From: Georg-Johann Lay [mailto:avr@gjlay.de] >>> Sent: Wednesday, June 15, 2011 3:26 PM >>> To: gcc-patches@gcc.gnu.org >>> Cc: Weddington, Eric; Anatoly Sokolov; Denis Chertykov >>> Subject: [Patch, AVR]: Hack around PR34734 >>> >>> PR34734 is an annoying, false C++ warning for code like >>> >>> const int x __attribute__((progmem)) = 1; >>> >>> progmem.c:1:30: warning: only initialized variables can be placed into >>> program memory area [enabled by default] >>> >>> The problem is that DECL_INITIAL is NULL at the specific point in >>> space and time (avr_handle_progmem_attribute) even though tree.def >>> promises otherwise. >>> >>> The patch hacks around by explicitly querying for C++ front end. >>> >>> Johann >>> >>> -- >>> >>> PR target/34734 >>> * config/avr/avr.c (avr_handle_progmem_attribute): Hack around >>> non-present DECL_INITIAL if front end is C++. > > >
Index: config/avr/avr.c =================================================================== --- config/avr/avr.c (Revision 175036) +++ config/avr/avr.c (Arbeitskopie) @@ -5099,7 +5099,15 @@ avr_handle_progmem_attribute (tree *node } else if (TREE_STATIC (*node) || DECL_EXTERNAL (*node)) { - if (DECL_INITIAL (*node) == NULL_TREE && !DECL_EXTERNAL (*node)) + if (DECL_INITIAL (*node) == NULL_TREE && !DECL_EXTERNAL (*node) + /* FIXME: Despite documentation in tree.def, + DECL_INITIAL is NULL if an initializer is + present in C++. This is presumably due to + different parsers for C resp. C++. + We hack around that annoying warning (PR34734) + by quering for the front end and emit a warning + just for non-C++. */ + && NULL == strcasestr (lang_hooks.name, "c++")) { warning (0, "only initialized variables can be placed into " "program memory area");