From f1c7b48638a3ec78129fee9672ed8e2616e63c9c Mon Sep 17 00:00:00 2001 From: Eli Friedman Date: Tue, 2 Sep 2008 05:09:35 +0000 Subject: [PATCH] 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 --- lib/Sema/SemaExpr.cpp | 7 ++++--- test/Sema/pointer-subtract-compat.c | 6 ++++++ 2 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 test/Sema/pointer-subtract-compat.c diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index ba13e7fe66..fe9a13e464 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -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()); diff --git a/test/Sema/pointer-subtract-compat.c b/test/Sema/pointer-subtract-compat.c new file mode 100644 index 0000000000..4ed6abf8af --- /dev/null +++ b/test/Sema/pointer-subtract-compat.c @@ -0,0 +1,6 @@ +// RUN: clang %s -fsyntax-only -verify -pedantic + +typedef const char rchar; +int a(char* a, rchar* b) { + return a-b; +} -- 2.40.0