]> granicus.if.org Git - clang/commitdiff
Fix for PR5679: make __builtin_prefetch a bit more flexible in what it accepts
authorEli Friedman <eli.friedman@gmail.com>
Fri, 4 Dec 2009 00:30:06 +0000 (00:30 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Fri, 4 Dec 2009 00:30:06 +0000 (00:30 +0000)
as a constant integer.  Also, some minor cleanup and improvements to the
diagnostics.

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

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaChecking.cpp
test/Sema/builtin-prefetch.c
test/SemaCXX/prefetch-enum.cpp [new file with mode: 0644]

index 600db621f77396f29411e6eb171edee237aecbc7..489264a2f24bed8275def51b114b97d73d98e83a 100644 (file)
@@ -2374,7 +2374,9 @@ def err_altivec_empty_initializer : Error<"expected initializer">;
 def err_stack_const_level : Error<
   "level argument for a stack address builtin must be constant">;
 
-def err_prefetch_invalid_argument : Error<
+def err_prefetch_invalid_arg_type : Error<
+  "argument to __builtin_prefetch must be of integer type">;
+def err_prefetch_invalid_arg_ice : Error<
   "argument to __builtin_prefetch must be a constant integer">;
 def err_argument_invalid_range : Error<
   "argument should be a value from %0 to %1">;
index 9060fe6ab742da05df1d05889b9e915481c4e71d..28de5005f8a825fa5e3a23ee79bf187c6c2ad9b1 100644 (file)
@@ -700,30 +700,30 @@ bool Sema::SemaBuiltinPrefetch(CallExpr *TheCall) {
     if (Arg->isTypeDependent())
       continue;
 
-    QualType RWType = Arg->getType();
-
-    const BuiltinType *BT = RWType->getAs<BuiltinType>();
-    llvm::APSInt Result;
-    if (!BT || BT->getKind() != BuiltinType::Int)
-      return Diag(TheCall->getLocStart(), diag::err_prefetch_invalid_argument)
+    if (!Arg->getType()->isIntegralType())
+      return Diag(TheCall->getLocStart(), diag::err_prefetch_invalid_arg_type)
               << Arg->getSourceRange();
 
+    ImpCastExprToType(Arg, Context.IntTy, CastExpr::CK_IntegralCast);
+    TheCall->setArg(i, Arg);
+
     if (Arg->isValueDependent())
       continue;
 
+    llvm::APSInt Result;
     if (!Arg->isIntegerConstantExpr(Result, Context))
-      return Diag(TheCall->getLocStart(), diag::err_prefetch_invalid_argument)
+      return Diag(TheCall->getLocStart(), diag::err_prefetch_invalid_arg_ice)
         << SourceRange(Arg->getLocStart(), Arg->getLocEnd());
 
     // FIXME: gcc issues a warning and rewrites these to 0. These
     // seems especially odd for the third argument since the default
     // is 3.
     if (i == 1) {
-      if (Result.getSExtValue() < 0 || Result.getSExtValue() > 1)
+      if (Result.getLimitedValue() > 1)
         return Diag(TheCall->getLocStart(), diag::err_argument_invalid_range)
              << "0" << "1" << Arg->getSourceRange();
     } else {
-      if (Result.getSExtValue() < 0 || Result.getSExtValue() > 3)
+      if (Result.getLimitedValue() > 3)
         return Diag(TheCall->getLocStart(), diag::err_argument_invalid_range)
             << "0" << "3" << Arg->getSourceRange();
     }
index bf28277acb81c32c4f72f7c1b3ffb438c1fc9702..4ee9f8947bbb50986a48c1bac6ed51a8e754b1e4 100644 (file)
@@ -6,7 +6,8 @@ void foo() {
   __builtin_prefetch(&a, 1);
   __builtin_prefetch(&a, 1, 2);
   __builtin_prefetch(&a, 1, 9, 3); // expected-error{{too many arguments to function}}
-  __builtin_prefetch(&a, "hello", 2); // expected-error{{argument to __builtin_prefetch must be a constant integer}}
+  __builtin_prefetch(&a, "hello", 2); // expected-error{{argument to __builtin_prefetch must be of integer type}}
+  __builtin_prefetch(&a, a, 2); // expected-error{{argument to __builtin_prefetch must be a constant integer}}
   __builtin_prefetch(&a, 2); // expected-error{{argument should be a value from 0 to 1}}
   __builtin_prefetch(&a, 0, 4); // expected-error{{argument should be a value from 0 to 3}}
   __builtin_prefetch(&a, -1, 4); // expected-error{{argument should be a value from 0 to 1}}
diff --git a/test/SemaCXX/prefetch-enum.cpp b/test/SemaCXX/prefetch-enum.cpp
new file mode 100644 (file)
index 0000000..829321f
--- /dev/null
@@ -0,0 +1,9 @@
+// RUN: clang-cc -fsyntax-only %s -verify
+// PR5679
+
+enum X { A = 3 };
+
+void Test() {
+  char ch;
+  __builtin_prefetch(&ch, 0, A);
+}