[C++] Fix three locations

Message ID eeb27c9f-44d4-9e1d-0e75-eec21f76f996@oracle.com
State New
Headers show
Series
  • [C++] Fix three locations
Related show

Commit Message

Paolo Carlini Jan. 9, 2019, 3:46 p.m.
Hi,

three additional fixes along the usual lines. In the grokdeclarator 
changes I'm not touching the actual printing of the name, but another 
option would be using %qD and decl here too, thus, for cases like 
parse/crash43.C, where everything lives inside a namespace, we would 
print 'N::i'. instead of simply 'i'. Tested x86_64-linux, plus I checked 
by hand with a cross-compiler the dllimport bit.

Thanks, Paolo.

////////////////////////
/cp
2019-01-09  Paolo Carlini  <paolo.carlini@oracle.com>

	* decl.c (start_decl): Improve error location.
	(grokdeclarator): Likewise, improve two locations.

/testsuite
2019-01-09  Paolo Carlini  <paolo.carlini@oracle.com>

	* g++.dg/diagnostic/extern-initialized.C: New.
	* g++.dg/ext/dllimport-initialized.C: Likewise.

Comments

Jason Merrill Jan. 10, 2019, 9:38 p.m. | #1
On 1/9/19 10:46 AM, Paolo Carlini wrote:
> Hi,

> 

> three additional fixes along the usual lines. In the grokdeclarator 

> changes I'm not touching the actual printing of the name, but another 

> option would be using %qD and decl here too, thus, for cases like 

> parse/crash43.C, where everything lives inside a namespace, we would 

> print 'N::i'. instead of simply 'i'. Tested x86_64-linux, plus I checked 

> by hand with a cross-compiler the dllimport bit.

> 

> Thanks, Paolo.

> 

> ////////////////////////

> 

OK.

Jason

Patch

Index: cp/decl.c
===================================================================
--- cp/decl.c	(revision 267756)
+++ cp/decl.c	(working copy)
@@ -5096,7 +5096,8 @@  start_decl (const cp_declarator *declarator,
      a definition.  */
   if (initialized && DECL_DLLIMPORT_P (decl))
     {
-      error ("definition of %q#D is marked %<dllimport%>", decl);
+      error_at (DECL_SOURCE_LOCATION (decl),
+		"definition of %q#D is marked %<dllimport%>", decl);
       DECL_DLLIMPORT_P (decl) = 0;
     }
 
@@ -12791,11 +12792,13 @@  grokdeclarator (const cp_declarator *declarator,
 	    /* It's common practice (and completely valid) to have a const
 	       be initialized and declared extern.  */
 	    if (!(type_quals & TYPE_QUAL_CONST))
-	      warning (0, "%qs initialized and declared %<extern%>", name);
+	      warning_at (DECL_SOURCE_LOCATION (decl), 0,
+			  "%qs initialized and declared %<extern%>", name);
 	  }
 	else
 	  {
-	    error ("%qs has both %<extern%> and initializer", name);
+	    error_at (DECL_SOURCE_LOCATION (decl),
+		      "%qs has both %<extern%> and initializer", name);
 	    return error_mark_node;
 	  }
       }
Index: testsuite/g++.dg/diagnostic/extern-initialized.C
===================================================================
--- testsuite/g++.dg/diagnostic/extern-initialized.C	(nonexistent)
+++ testsuite/g++.dg/diagnostic/extern-initialized.C	(working copy)
@@ -0,0 +1,6 @@ 
+extern int i __attribute__((unused)) = 0;  // { dg-warning "12:.i. initialized and declared .extern." }
+
+void foo()
+{
+  extern int i __attribute__((unused)) = 0;  // { dg-error "14:.i. has both .extern. and initializer" }
+}
Index: testsuite/g++.dg/ext/dllimport-initialized.C
===================================================================
--- testsuite/g++.dg/ext/dllimport-initialized.C	(nonexistent)
+++ testsuite/g++.dg/ext/dllimport-initialized.C	(working copy)
@@ -0,0 +1,3 @@ 
+// { dg-do compile { target i?86-*-cygwin* i?86-*-mingw* x86_64-*-mingw* } }
+
+__attribute__((dllimport)) int i __attribute__((unused)) = 0;  // { dg-error "32:definition of .int i. is marked .dllimport." }