Make sure to take the unqualified versions of the canonical types for

type-checking pointer subtraction; if the canonical types aren't used,
the qualifiers won't always get stripped off correctly.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@55620 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Eli Friedman 2008-09-02 05:09:35 +00:00
Родитель f43aa4410f
Коммит f1c7b48638
2 изменённых файлов: 10 добавлений и 3 удалений

Просмотреть файл

@ -1013,7 +1013,7 @@ ActOnCallExpr(ExprTy *fn, SourceLocation LParenLoc,
AssignConvertType ConvTy =
CheckSingleAssignmentConstraints(ProtoArgType, Arg);
TheCall->setArg(i, Arg);
if (DiagnoseAssignmentResult(ConvTy, Arg->getLocStart(), ProtoArgType,
ArgType, Arg, "passing"))
return true;
@ -1700,8 +1700,9 @@ QualType Sema::CheckSubtractionOperands(Expr *&lex, Expr *&rex,
}
// Pointee types must be compatible.
if (!Context.typesAreCompatible(lpointee.getUnqualifiedType(),
rpointee.getUnqualifiedType())) {
if (!Context.typesAreCompatible(
Context.getCanonicalType(lpointee).getUnqualifiedType(),
Context.getCanonicalType(rpointee).getUnqualifiedType())) {
Diag(loc, diag::err_typecheck_sub_ptr_compatible,
lex->getType().getAsString(), rex->getType().getAsString(),
lex->getSourceRange(), rex->getSourceRange());

Просмотреть файл

@ -0,0 +1,6 @@
// RUN: clang %s -fsyntax-only -verify -pedantic
typedef const char rchar;
int a(char* a, rchar* b) {
return a-b;
}