Commit bae5cddf by Jakub Jelinek Committed by Jakub Jelinek

re PR c/48552 (ICE with void type expressions in asm inputs/outputs)

	PR c/48552
	* c-typeck.c (build_asm_expr): Error out on attempts to use
	void type outputs or inputs for constraints that allow reg or
	don't allow memory.

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

From-SVN: r172298
parent 06eb52ca
2011-04-12 Jakub Jelinek <jakub@redhat.com>
PR c/48552
* c-typeck.c (build_asm_expr): Error out on attempts to use
void type outputs or inputs for constraints that allow reg or
don't allow memory.
2011-04-11 Chung-Lin Tang <cltang@codesourcery.com>
Richard Earnshaw <rearnsha@arm.com>
......
......@@ -8502,6 +8502,13 @@ build_asm_expr (location_t loc, tree string, tree outputs, tree inputs,
mark it addressable. */
if (!allows_reg && !c_mark_addressable (output))
output = error_mark_node;
if (!(!allows_reg && allows_mem)
&& output != error_mark_node
&& VOID_TYPE_P (TREE_TYPE (output)))
{
error_at (loc, "invalid use of void expression");
output = error_mark_node;
}
}
else
output = error_mark_node;
......@@ -8528,7 +8535,12 @@ build_asm_expr (location_t loc, tree string, tree outputs, tree inputs,
STRIP_NOPS (input);
if (!c_mark_addressable (input))
input = error_mark_node;
}
}
else if (input != error_mark_node && VOID_TYPE_P (TREE_TYPE (input)))
{
error_at (loc, "invalid use of void expression");
input = error_mark_node;
}
}
else
input = error_mark_node;
......
2011-04-12 Jakub Jelinek <jakub@redhat.com>
PR c/48552
* gcc.dg/pr48552-1.c: New test.
* gcc.dg/pr48552-2.c: New test.
2011-04-11 Jason Merrill <jason@redhat.com>
* g++.dg/cpp0x/sfinae12.C: New.
......
/* PR c/48552 */
/* { dg-do compile } */
/* { dg-options "" } */
struct S;
void
f1 (void *x)
{
__asm volatile ("" : : "r" (*x)); /* { dg-warning "dereferencing" } */
} /* { dg-error "invalid use of void expression" "" { target *-*-* } 10 } */
void
f2 (void *x)
{
__asm volatile ("" : "=r" (*x)); /* { dg-warning "dereferencing" } */
} /* { dg-error "invalid use of void expression" "" { target *-*-* } 16 } */
/* { dg-error "invalid lvalue in asm output 0" "" { target *-*-* } 16 } */
void
f3 (void *x)
{
__asm volatile ("" : : "m" (*x)); /* { dg-warning "dereferencing" } */
}
void
f4 (void *x)
{
__asm volatile ("" : "=m" (*x)); /* { dg-warning "dereferencing" } */
}
void
f5 (void *x)
{
__asm volatile ("" : : "g" (*x)); /* { dg-warning "dereferencing" } */
} /* { dg-error "invalid use of void expression" "" { target *-*-* } 34 } */
void
f6 (void *x)
{
__asm volatile ("" : "=g" (*x)); /* { dg-warning "dereferencing" } */
} /* { dg-error "invalid use of void expression" "" { target *-*-* } 40 } */
/* { dg-error "invalid lvalue in asm output 0" "" { target *-*-* } 40 } */
void
f7 (struct S *x)
{
__asm volatile ("" : : "r" (*x)); /* { dg-error "dereferencing pointer to incomplete type" } */
}
void
f8 (struct S *x)
{
__asm volatile ("" : "=r" (*x)); /* { dg-error "dereferencing pointer to incomplete type" } */
} /* { dg-error "invalid lvalue in asm output 0" "" { target *-*-* } 52 } */
/* PR c/48552 */
/* { dg-do compile } */
/* { dg-options "" } */
struct S;
void
f1 (void *x)
{
__asm ("" : : "r" (*x)); /* { dg-warning "dereferencing" } */
} /* { dg-error "invalid use of void expression" "" { target *-*-* } 10 } */
void
f2 (void *x)
{
__asm ("" : "=r" (*x)); /* { dg-warning "dereferencing" } */
} /* { dg-error "invalid use of void expression" "" { target *-*-* } 16 } */
/* { dg-error "invalid lvalue in asm output 0" "" { target *-*-* } 16 } */
void
f3 (void *x)
{
__asm ("" : : "m" (*x)); /* { dg-warning "dereferencing" } */
}
void
f4 (void *x)
{
__asm ("" : "=m" (*x)); /* { dg-warning "dereferencing" } */
}
void
f5 (void *x)
{
__asm ("" : : "g" (*x)); /* { dg-warning "dereferencing" } */
} /* { dg-error "invalid use of void expression" "" { target *-*-* } 34 } */
void
f6 (void *x)
{
__asm ("" : "=g" (*x)); /* { dg-warning "dereferencing" } */
} /* { dg-error "invalid use of void expression" "" { target *-*-* } 40 } */
/* { dg-error "invalid lvalue in asm output 0" "" { target *-*-* } 40 } */
void
f7 (struct S *x)
{
__asm ("" : : "r" (*x)); /* { dg-error "dereferencing pointer to incomplete type" } */
}
void
f8 (struct S *x)
{
__asm ("" : "=r" (*x)); /* { dg-error "dereferencing pointer to incomplete type" } */
} /* { dg-error "invalid lvalue in asm output 0" "" { target *-*-* } 52 } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment