generalize some of the conversion warnings.

llvm-svn: 45560
This commit is contained in:
Chris Lattner 2008-01-03 23:38:43 +00:00
parent 166ae81be1
commit 816dea2fc5
5 changed files with 38 additions and 31 deletions

View File

@ -152,6 +152,14 @@ bool Sema::Diag(SourceLocation Loc, unsigned DiagID, const std::string &Msg1,
return true; return true;
} }
bool Sema::Diag(SourceLocation Loc, unsigned DiagID, const std::string &Msg1,
const std::string &Msg2, const std::string &Msg3,
SourceRange R1) {
std::string MsgArr[] = { Msg1, Msg2, Msg3 };
PP.getDiagnostics().Report(PP.getFullLoc(Loc), DiagID, MsgArr, 3, &R1, 1);
return true;
}
bool Sema::Diag(SourceLocation Loc, unsigned DiagID, bool Sema::Diag(SourceLocation Loc, unsigned DiagID,
SourceRange R1, SourceRange R2) { SourceRange R1, SourceRange R2) {
SourceRange RangeArr[] = { R1, R2 }; SourceRange RangeArr[] = { R1, R2 };

View File

@ -159,6 +159,8 @@ public:
SourceRange R1, SourceRange R2); SourceRange R1, SourceRange R2);
bool Diag(SourceLocation Loc, unsigned DiagID, const std::string &Msg1, bool Diag(SourceLocation Loc, unsigned DiagID, const std::string &Msg1,
const std::string &Msg2, SourceRange R1); const std::string &Msg2, SourceRange R1);
bool Diag(SourceLocation Loc, unsigned DiagID, const std::string &Msg1,
const std::string &Msg2, const std::string &Msg3, SourceRange R1);
bool Diag(SourceLocation Loc, unsigned DiagID, bool Diag(SourceLocation Loc, unsigned DiagID,
const std::string &Msg1, const std::string &Msg2, const std::string &Msg1, const std::string &Msg2,
SourceRange R1, SourceRange R2); SourceRange R1, SourceRange R2);

View File

@ -2229,38 +2229,35 @@ bool Sema::CheckMessageArgumentTypes(Expr **Args, unsigned NumArgs,
Args[i] = argExpr; // Make sure we store the converted expression. Args[i] = argExpr; // Make sure we store the converted expression.
SourceLocation l = argExpr->getLocStart(); SourceLocation l = argExpr->getLocStart();
// decode the result (notice that AST's are still created for extensions). // Decode the result (notice that AST's are still created for extensions).
const char *Kind = "sending";
switch (result) { switch (result) {
case Compatible: case Compatible:
break; break;
case PointerFromInt: case PointerFromInt:
Diag(l, diag::ext_typecheck_sending_pointer_int,
lhsType.getAsString(), rhsType.getAsString(),
argExpr->getSourceRange());
break;
case IntFromPointer: case IntFromPointer:
Diag(l, diag::ext_typecheck_sending_pointer_int, Diag(l, diag::ext_typecheck_convert_pointer_int,
lhsType.getAsString(), rhsType.getAsString(), lhsType.getAsString(), rhsType.getAsString(), Kind,
argExpr->getSourceRange()); argExpr->getSourceRange());
break; break;
case IncompatiblePointer: case IncompatiblePointer:
Diag(l, diag::ext_typecheck_sending_incompatible_pointer, Diag(l, diag::ext_typecheck_convert_incompatible_pointer,
rhsType.getAsString(), lhsType.getAsString(), lhsType.getAsString(), rhsType.getAsString(), Kind,
argExpr->getSourceRange()); argExpr->getSourceRange());
break; break;
case FunctionVoidPointer: case FunctionVoidPointer:
Diag(l, diag::ext_typecheck_sending_pointer_void_func, Diag(l, diag::ext_typecheck_convert_pointer_void_func,
rhsType.getAsString(), lhsType.getAsString(), lhsType.getAsString(), rhsType.getAsString(), Kind,
argExpr->getSourceRange()); argExpr->getSourceRange());
break; break;
case CompatiblePointerDiscardsQualifiers: case CompatiblePointerDiscardsQualifiers:
Diag(l, diag::ext_typecheck_sending_discards_qualifiers, Diag(l, diag::ext_typecheck_convert_discards_qualifiers,
rhsType.getAsString(), lhsType.getAsString(), lhsType.getAsString(), rhsType.getAsString(), Kind,
argExpr->getSourceRange()); argExpr->getSourceRange());
break; break;
case Incompatible: case Incompatible:
Diag(l, diag::err_typecheck_sending_incompatible, Diag(l, diag::err_typecheck_convert_incompatible,
rhsType.getAsString(), lhsType.getAsString(), lhsType.getAsString(), rhsType.getAsString(), Kind,
argExpr->getSourceRange()); argExpr->getSourceRange());
anyIncompatibleArgs = true; anyIncompatibleArgs = true;
} }

View File

@ -759,6 +759,18 @@ DIAG(ext_typecheck_comparison_of_distinct_pointers, WARNING,
"comparison of distinct pointer types ('%0' and '%1')") "comparison of distinct pointer types ('%0' and '%1')")
DIAG(err_typecheck_assign_const, ERROR, DIAG(err_typecheck_assign_const, ERROR,
"read-only variable is not assignable") "read-only variable is not assignable")
DIAG(err_typecheck_convert_incompatible, ERROR,
"incompatible type %2 '%1', expected '%0'")
DIAG(ext_typecheck_convert_pointer_int, EXTENSION,
"incompatible pointer/int conversion %2 '%1', expected '%0'")
DIAG(ext_typecheck_convert_pointer_void_func, EXTENSION,
"%2 '%1' converts between void* and function pointer, expected '%0'")
DIAG(ext_typecheck_convert_incompatible_pointer, EXTENSION,
"incompatible pointer types %d '%1', expected '%0'")
DIAG(ext_typecheck_convert_discards_qualifiers, EXTENSION,
"%d '%1' discards qualifiers, expected '%0'")
DIAG(err_typecheck_return_incompatible, ERROR, DIAG(err_typecheck_return_incompatible, ERROR,
@ -796,18 +808,6 @@ DIAG(ext_typecheck_passing_pointer_void_func, EXTENSION,
DIAG(ext_typecheck_passing_discards_qualifiers, WARNING, DIAG(ext_typecheck_passing_discards_qualifiers, WARNING,
"passing '%0' to '%1' discards qualifiers") "passing '%0' to '%1' discards qualifiers")
DIAG(err_typecheck_sending_incompatible, ERROR,
"incompatible types passing '%0' to method expecting '%1'")
DIAG(ext_typecheck_sending_incompatible_pointer, WARNING,
"incompatible pointer types passing '%0' to method expecting '%1'")
DIAG(ext_typecheck_sending_pointer_int, WARNING,
"incompatible types passing '%1' to method expecting '%0'")
DIAG(ext_typecheck_sending_pointer_void_func, EXTENSION,
"sending '%1' to method expecting '%0' converts between void*"
" and function pointer")
DIAG(ext_typecheck_sending_discards_qualifiers, WARNING,
"sending '%0' to '%1' discards qualifiers")
DIAG(err_typecheck_array_not_modifiable_lvalue, ERROR, DIAG(err_typecheck_array_not_modifiable_lvalue, ERROR,
"array type '%0' is not assignable") "array type '%0' is not assignable")

View File

@ -1,4 +1,4 @@
// RUN: clang -fsyntax-only -verify %s // RUN: clang -fsyntax-only -verify -pedantic %s
struct S { int a; }; struct S { int a; };
@ -19,7 +19,7 @@ void test() {
charStarFunc(1); // expected-warning {{incompatible types passing 'int' to function expecting 'char *'}} charStarFunc(1); // expected-warning {{incompatible types passing 'int' to function expecting 'char *'}}
charFunc("abc"); // expected-warning {{incompatible types passing 'char *' to function expecting 'char'}} charFunc("abc"); // expected-warning {{incompatible types passing 'char *' to function expecting 'char'}}
[obj charStarMeth:1]; // expected-warning {{incompatible types passing 'int' to method expecting 'char *'}} [obj charStarMeth:1]; // expected-warning {{incompatible pointer/int conversion sending 'int'}}
[obj structMeth:1]; // expected-error {{incompatible types passing 'int' to method expecting 'struct S'}} [obj structMeth:1]; // expected-error {{incompatible type sending 'int'}}
[obj structMeth:sInst :1]; // expected-error {{incompatible types passing 'int' to method expecting 'struct S'}} [obj structMeth:sInst :1]; // expected-error {{incompatible type sending 'int'}}
} }