diff options
author | Eli Friedman <eli.friedman@gmail.com> | 2008-09-02 05:09:35 +0000 |
---|---|---|
committer | Eli Friedman <eli.friedman@gmail.com> | 2008-09-02 05:09:35 +0000 |
commit | f1c7b48638a3ec78129fee9672ed8e2616e63c9c (patch) | |
tree | d61e3158e5ebe808ca420956aae32f5e07dccbf2 | |
parent | f43aa4410f6fa53d72a277b3429c9f814f54d1b5 (diff) |
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
-rw-r--r-- | lib/Sema/SemaExpr.cpp | 7 | ||||
-rw-r--r-- | test/Sema/pointer-subtract-compat.c | 6 |
2 files changed, 10 insertions, 3 deletions
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; +} |