diff mbox

[AVR] : Hack around PR34734

Message ID 4DF8B2CF.7070401@gjlay.de
State New
Headers show

Commit Message

Georg-Johann Lay June 15, 2011, 1:25 p.m. UTC
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++.

Comments

Richard Biener June 16, 2011, 7:51 a.m. UTC | #1
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++.
>
>
>
diff mbox

Patch

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");