]> granicus.if.org Git - clang/commitdiff
Remove offset size check in nullptr arithmetic handling
authorAndrew Kaylor <andrew.kaylor@intel.com>
Wed, 20 Sep 2017 18:06:44 +0000 (18:06 +0000)
committerAndrew Kaylor <andrew.kaylor@intel.com>
Wed, 20 Sep 2017 18:06:44 +0000 (18:06 +0000)
Differential Revision: https://reviews.llvm.org/D37042

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@313784 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/Expr.cpp
test/CodeGen/nullptr-arithmetic.c
test/Sema/pointer-addition.c
test/SemaCXX/nullptr-arithmetic.cpp

index f04a78f609a2246413a6472b6474d0db56716db6..aab89d392dc1444992a8bf1b369d2457b4e69e8c 100644 (file)
@@ -1837,17 +1837,14 @@ bool BinaryOperator::isNullPointerArithmeticExtension(ASTContext &Ctx,
 
   // Check that we have one pointer and one integer operand.
   Expr *PExp;
-  Expr *IExp;
   if (LHS->getType()->isPointerType()) {
     if (!RHS->getType()->isIntegerType())
       return false;
     PExp = LHS;
-    IExp = RHS;
   } else if (RHS->getType()->isPointerType()) {
     if (!LHS->getType()->isIntegerType())
       return false;
     PExp = RHS;
-    IExp = LHS;
   } else {
     return false;
   }
@@ -1862,10 +1859,6 @@ bool BinaryOperator::isNullPointerArithmeticExtension(ASTContext &Ctx,
   if (!PTy || !PTy->getPointeeType()->isCharType())
     return false;
 
-  // Check that the integer type is pointer-sized.
-  if (Ctx.getTypeSize(IExp->getType()) != Ctx.getTypeSize(PExp->getType()))
-    return false;
-
   return true;
 }
 InitListExpr::InitListExpr(const ASTContext &C, SourceLocation lbraceloc,
index 0c8ad5e34dc96eede23ff750866f925e33c12e6d..ce9c9765b0f7ce377dc2fd54ca8459e62cb7bec7 100644 (file)
@@ -1,4 +1,6 @@
 // RUN: %clang_cc1 -S %s -emit-llvm -o - | FileCheck %s
+// RUN: %clang_cc1 -S %s -emit-llvm -triple i686-unknown-unknown -o - | FileCheck %s
+// RUN: %clang_cc1 -S %s -emit-llvm -triple x86_64-unknown-unknown -o - | FileCheck %s
 
 #include <stdint.h>
 
@@ -32,3 +34,14 @@ int8_t* test3(intptr_t n) {
 // CHECK-LABEL: test3
 // CHECK: getelementptr
 // CHECK-NOT: inttoptr
+
+// This checks the case where the offset isn't pointer-sized.
+// The front end will implicitly cast the offset to an integer, so we need to
+// make sure that doesn't cause problems on targets where integers and pointers
+// are not the same size.
+int8_t *test4(int8_t b) {
+  return NULLPTRI8 + b;
+}
+// CHECK-LABEL: test4
+// CHECK: inttoptr
+// CHECK-NOT: getelementptr
index 3e77cbde477cde35a229aa945971772ca5b6de68..562f05340f7cb4858e8e5737aa132d05f3615b1f 100644 (file)
@@ -1,4 +1,6 @@
 // RUN: %clang_cc1 %s -fsyntax-only -verify -pedantic -Wextra -std=c11
+// RUN: %clang_cc1 %s -fsyntax-only -triple i686-unknown-unknown -verify -pedantic -Wextra -std=c11
+// RUN: %clang_cc1 %s -fsyntax-only -triple x86_64-unknown-unknown -verify -pedantic -Wextra -std=c11
 
 #include <stdint.h>
 
index 7d11e268f2545ebeea94ec6bc3b9596b6922cbe0..9963c8858ee8768221a152e82588e03240771bb7 100644 (file)
@@ -1,4 +1,6 @@
 // RUN: %clang_cc1 %s -fsyntax-only -verify -pedantic -Wextra -std=c++11
+// RUN: %clang_cc1 %s -fsyntax-only -triple i686-unknown-unknown -verify -pedantic -Wextra -std=c++11
+// RUN: %clang_cc1 %s -fsyntax-only -triple x86_64-unknown-unknown -verify -pedantic -Wextra -std=c++11
 
 #include <stdint.h>