Sanity-check argument to indirect goto.

llvm-svn: 67746
This commit is contained in:
Eli Friedman 2009-03-26 07:32:37 +00:00
parent 55a2cd736d
commit 6568eef9f9
2 changed files with 15 additions and 3 deletions

View File

@ -687,10 +687,14 @@ Sema::ActOnGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
Action::OwningStmtResult
Sema::ActOnIndirectGotoStmt(SourceLocation GotoLoc,SourceLocation StarLoc,
ExprArg DestExp) {
// FIXME: Verify that the operand is convertible to void*.
// Convert operand to void*
Expr* E = (Expr*)DestExp.release();
ImpCastExprToType(E, Context.VoidPtrTy);
Expr* E = DestExp.takeAs<Expr>();
QualType ETy = E->getType();
AssignConvertType ConvTy =
CheckSingleAssignmentConstraints(Context.VoidPtrTy, E);
if (DiagnoseAssignmentResult(ConvTy, StarLoc, Context.VoidPtrTy, ETy,
E, "passing"))
return StmtError();
return Owned(new (Context) IndirectGotoStmt(E));
}

View File

@ -0,0 +1,8 @@
// RUN: clang-cc -fsyntax-only -verify %s
struct c {int x;};
int a(struct c x, long long y) {
goto *x; // expected-error{{incompatible type}}
goto *y; // expected-warning{{incompatible integer to pointer conversion}}
}