diff options
author | Douglas Gregor <dgregor@apple.com> | 2012-06-29 01:05:22 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2012-06-29 01:05:22 +0000 |
commit | 98c3cfc3b95021af4281411aa3ceadf1854491ad (patch) | |
tree | 335b30246b796004c753ccac1631d3bbccb6f07d /clang | |
parent | 86c3250b820c8e6d14ae0b6077256dc41da26fb9 (diff) | |
download | bcm5719-llvm-98c3cfc3b95021af4281411aa3ceadf1854491ad.tar.gz bcm5719-llvm-98c3cfc3b95021af4281411aa3ceadf1854491ad.zip |
When a builtin that requires a constant is given a type- or
value-dependent expression, don't complain that it wasn't the constant
we wanted. Fixes <rdar://problem/11688587> and PR11074.
llvm-svn: 159404
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/Sema/SemaChecking.cpp | 18 | ||||
-rw-r--r-- | clang/test/SemaCXX/neon-vector-types.cpp | 19 |
2 files changed, 34 insertions, 3 deletions
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index ef7dc8819f8..f3bc273d994 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -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; diff --git a/clang/test/SemaCXX/neon-vector-types.cpp b/clang/test/SemaCXX/neon-vector-types.cpp index aa82b11e8cd..336fcd4f18d 100644 --- a/clang/test/SemaCXX/neon-vector-types.cpp +++ b/clang/test/SemaCXX/neon-vector-types.cpp @@ -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}} +} |