re PR c/67730 (No warning when returning NULL in void function)

PR c/67730
	* c-typeck.c (convert_for_assignment): Use the expansion point
	location throughout.

	* gcc.dg/pr67730-1.c: New test.
	* gcc.dg/pr67730-2.c: New test.
	* gcc.dg/pr67730.h: New test.

From-SVN: r228408
This commit is contained in:
Marek Polacek 2015-10-02 18:01:50 +00:00 committed by Marek Polacek
parent 12651878c6
commit 1c7485afda
6 changed files with 87 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2015-10-02 Marek Polacek <polacek@redhat.com>
PR c/67730
* c-typeck.c (convert_for_assignment): Use the expansion point
location throughout.
2015-10-02 Marek Polacek <polacek@redhat.com>
PR c/64249

View File

@ -5718,6 +5718,10 @@ convert_for_assignment (location_t location, location_t expr_loc, tree type,
tree rname = NULL_TREE;
bool objc_ok = false;
/* Use the expansion point location to handle cases such as user's
function returning a wrong-type macro defined in a system header. */
location = expansion_point_location_if_in_system_header (location);
if (errtype == ic_argpass)
{
tree selector;

View File

@ -1,3 +1,10 @@
2015-10-02 Marek Polacek <polacek@redhat.com>
PR c/67730
* gcc.dg/pr67730-1.c: New test.
* gcc.dg/pr67730-2.c: New test.
* gcc.dg/pr67730.h: New test.
2015-10-02 Marek Polacek <polacek@redhat.com>
* c-c++-common/Wduplicated-cond-2.c: Skip until PR67819 is resolved.

View File

@ -0,0 +1,16 @@
/* PR c/67730 */
/* { dg-do compile } */
/* { dg-options "-Wc++-compat" } */
#include "pr67730.h"
extern void bar (unsigned char *);
unsigned char *
f (void *p)
{
unsigned char *uc = ONEP; /* { dg-warning "request for implicit conversion" } */
uc = ONEP; /* { dg-warning "request for implicit conversion" } */
bar (ONEP); /* { dg-warning "request for implicit conversion" } */
return ONEP; /* { dg-warning "request for implicit conversion" } */
}

View File

@ -0,0 +1,22 @@
/* PR c/67730 */
/* { dg-do compile } */
/* { dg-options "" } */
#include "pr67730.h"
extern void bar (int);
int
fn1 (void)
{
int a = NULL; /* { dg-warning "initialization makes integer from pointer" } */
a = NULL; /* { dg-warning "assignment makes integer from pointer" } */
bar (NULL); /* { dg-warning "passing argument 1" } */
return NULL; /* { dg-warning "return makes integer from pointer" } */
}
int
fn2 (void)
{
RETURN; /* { dg-warning "return makes integer from pointer" } */
}

View File

@ -0,0 +1,32 @@
#pragma GCC system_header
#define NULL (void *) 0
#define ONEP (void *) 1
#define RETURN return NULL
extern void sysbar (unsigned char *);
unsigned char *
sysfn1 (void *p)
{
unsigned char *uc = ONEP;
uc = ONEP;
sysbar (ONEP);
return ONEP;
}
extern void sysbar2 (int);
int
sysfn2 (void)
{
int a = NULL;
a = NULL;
sysbar2 (NULL);
return NULL;
}
int
sysfn3 (void)
{
RETURN;
}