]> granicus.if.org Git - clang/commitdiff
When a builtin that requires a constant is given a type- or
authorDouglas Gregor <dgregor@apple.com>
Fri, 29 Jun 2012 01:05:22 +0000 (01:05 +0000)
committerDouglas Gregor <dgregor@apple.com>
Fri, 29 Jun 2012 01:05:22 +0000 (01:05 +0000)
value-dependent expression, don't complain that it wasn't the constant
we wanted. Fixes <rdar://problem/11688587> and PR11074.

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

lib/Sema/SemaChecking.cpp
test/SemaCXX/neon-vector-types.cpp

index ef7dc8819f8194d4e0e4e791a0762bb512934475..f3bc273d99433ff7df4c745de861a710d3ccf829 100644 (file)
@@ -405,6 +405,11 @@ bool Sema::CheckARMBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) {
 #undef GET_NEON_IMMEDIATE_CHECK
   };
 
+  // We can't check the value of a dependent argument.
+  if (TheCall->getArg(i)->isTypeDependent() ||
+      TheCall->getArg(i)->isValueDependent())
+    return false;
+
   // Check that the immediate argument is actually a constant.
   if (SemaBuiltinConstantArg(TheCall, i, Result))
     return true;
@@ -1478,7 +1483,11 @@ bool Sema::SemaBuiltinPrefetch(CallExpr *TheCall) {
   // constant integers.
   for (unsigned i = 1; i != NumArgs; ++i) {
     Expr *Arg = TheCall->getArg(i);
-    
+
+    // We can't check the value of a dependent argument.
+    if (Arg->isTypeDependent() || Arg->isValueDependent())
+      continue;
+
     llvm::APSInt Result;
     if (SemaBuiltinConstantArg(TheCall, i, Result))
       return true;
@@ -1523,7 +1532,12 @@ bool Sema::SemaBuiltinConstantArg(CallExpr *TheCall, int ArgNum,
 // For compatibility check 0-3, llvm only handles 0 and 2.
 bool Sema::SemaBuiltinObjectSize(CallExpr *TheCall) {
   llvm::APSInt Result;
-  
+
+  // We can't check the value of a dependent argument.
+  if (TheCall->getArg(1)->isTypeDependent() ||
+      TheCall->getArg(1)->isValueDependent())
+    return false;
+
   // Check constant-ness first.
   if (SemaBuiltinConstantArg(TheCall, 1, Result))
     return true;
index aa82b11e8cd7ed004f70fcbbd8dde8c29a34b519..336fcd4f18d6aa01fac692b0e3fad0ee660e5e60 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -fsyntax-only -verify %s
+// RUN: %clang_cc1 -fsyntax-only -verify "-triple" "thumbv7-apple-ios3.0.0" %s
 // rdar://9208404
 
 typedef int MP4Err;
@@ -25,3 +25,20 @@ MP4Err autoCorrelation2nd_Neon(Float32 *alphar, Float32 *alphai,
   return 0;
 }
 
+namespace rdar11688587 {
+  typedef float float32_t;
+  typedef __attribute__((neon_vector_type(4))) float32_t float32x4_t;
+
+  template<int I>
+  float test()
+  {
+    extern float32x4_t vec;
+    return __extension__ ({ 
+        float32x4_t __a = (vec); 
+        (float32_t)__builtin_neon_vgetq_lane_f32(__a, I);  // expected-error{{argument should be a value from 0 to 3}}
+      });
+  }
+
+  template float test<1>();
+  template float test<4>(); // expected-note{{in instantiation of function template specialization 'rdar11688587::test<4>' requested here}}
+}