forked from OSchip/llvm-project
Fix <rdar://problem/5928590> clang -fsyntax-only: "incompatible operand types ('int' and 'void')" on input that 'gcc -fsyntax-only' eats
llvm-svn: 51002
This commit is contained in:
parent
1e11768a4f
commit
bf1516c618
|
@ -904,6 +904,8 @@ DIAG(err_typecheck_call_invalid_ordered_compare, ERROR,
|
|||
"ordered compare requires two args of floating point type ('%0' and '%1')")
|
||||
DIAG(err_typecheck_cond_expect_scalar, ERROR,
|
||||
"used type '%0' where arithmetic or pointer type is required")
|
||||
DIAG(ext_typecheck_cond_one_void, EXTENSION,
|
||||
"C99 forbids conditional expressions with only one void side")
|
||||
DIAG(err_typecheck_expect_scalar_operand, ERROR,
|
||||
"operand of type '%0' where arithmetic or pointer type is required")
|
||||
DIAG(err_typecheck_cond_incompatible_operands, ERROR,
|
||||
|
|
|
@ -856,9 +856,16 @@ inline QualType Sema::CheckConditionalOperands( // C99 6.5.15
|
|||
}
|
||||
|
||||
// C99 6.5.15p5: "If both operands have void type, the result has void type."
|
||||
if (lexT->isVoidType() && rexT->isVoidType())
|
||||
// The following || allows only one side to be void (a GCC-ism).
|
||||
if (lexT->isVoidType() || rexT->isVoidType()) {
|
||||
if (!lexT->isVoidType())
|
||||
Diag(rex->getLocStart(), diag::ext_typecheck_cond_one_void,
|
||||
rex->getSourceRange());
|
||||
if (!rexT->isVoidType())
|
||||
Diag(lex->getLocStart(), diag::ext_typecheck_cond_one_void,
|
||||
lex->getSourceRange());
|
||||
return lexT.getUnqualifiedType();
|
||||
|
||||
}
|
||||
// C99 6.5.15p6 - "if one operand is a null pointer constant, the result has
|
||||
// the type of the other operand."
|
||||
if (lexT->isPointerType() && rex->isNullPointerConstant(Context)) {
|
||||
|
|
|
@ -36,3 +36,7 @@ void foo() {
|
|||
*(0 ? (asdf) 0 : &x) = 10;
|
||||
}
|
||||
|
||||
int Postgresql() {
|
||||
char x;
|
||||
return ((((&x) != ((void *) 0)) ? (*(&x) = ((char) 1)) : (void) ((void *) 0)), (unsigned long) ((void *) 0)); // expected-warning {{C99 forbids conditional expressions with only one void side}}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue