forked from OSchip/llvm-project
When checking a call to a builtin atomic operation, be sure to
consider the _<width> variants as well, which we'll see if we're performing the type checking in a template instantiation where the call expression itself was originally not type-dependent. Fixes PR11411. llvm-svn: 145248
This commit is contained in:
parent
e2031bbcb8
commit
7372248a98
|
@ -183,20 +183,95 @@ Sema::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) {
|
|||
TheCall->setType(Context.IntTy);
|
||||
break;
|
||||
case Builtin::BI__sync_fetch_and_add:
|
||||
case Builtin::BI__sync_fetch_and_add_1:
|
||||
case Builtin::BI__sync_fetch_and_add_2:
|
||||
case Builtin::BI__sync_fetch_and_add_4:
|
||||
case Builtin::BI__sync_fetch_and_add_8:
|
||||
case Builtin::BI__sync_fetch_and_add_16:
|
||||
case Builtin::BI__sync_fetch_and_sub:
|
||||
case Builtin::BI__sync_fetch_and_sub_1:
|
||||
case Builtin::BI__sync_fetch_and_sub_2:
|
||||
case Builtin::BI__sync_fetch_and_sub_4:
|
||||
case Builtin::BI__sync_fetch_and_sub_8:
|
||||
case Builtin::BI__sync_fetch_and_sub_16:
|
||||
case Builtin::BI__sync_fetch_and_or:
|
||||
case Builtin::BI__sync_fetch_and_or_1:
|
||||
case Builtin::BI__sync_fetch_and_or_2:
|
||||
case Builtin::BI__sync_fetch_and_or_4:
|
||||
case Builtin::BI__sync_fetch_and_or_8:
|
||||
case Builtin::BI__sync_fetch_and_or_16:
|
||||
case Builtin::BI__sync_fetch_and_and:
|
||||
case Builtin::BI__sync_fetch_and_and_1:
|
||||
case Builtin::BI__sync_fetch_and_and_2:
|
||||
case Builtin::BI__sync_fetch_and_and_4:
|
||||
case Builtin::BI__sync_fetch_and_and_8:
|
||||
case Builtin::BI__sync_fetch_and_and_16:
|
||||
case Builtin::BI__sync_fetch_and_xor:
|
||||
case Builtin::BI__sync_fetch_and_xor_1:
|
||||
case Builtin::BI__sync_fetch_and_xor_2:
|
||||
case Builtin::BI__sync_fetch_and_xor_4:
|
||||
case Builtin::BI__sync_fetch_and_xor_8:
|
||||
case Builtin::BI__sync_fetch_and_xor_16:
|
||||
case Builtin::BI__sync_add_and_fetch:
|
||||
case Builtin::BI__sync_add_and_fetch_1:
|
||||
case Builtin::BI__sync_add_and_fetch_2:
|
||||
case Builtin::BI__sync_add_and_fetch_4:
|
||||
case Builtin::BI__sync_add_and_fetch_8:
|
||||
case Builtin::BI__sync_add_and_fetch_16:
|
||||
case Builtin::BI__sync_sub_and_fetch:
|
||||
case Builtin::BI__sync_sub_and_fetch_1:
|
||||
case Builtin::BI__sync_sub_and_fetch_2:
|
||||
case Builtin::BI__sync_sub_and_fetch_4:
|
||||
case Builtin::BI__sync_sub_and_fetch_8:
|
||||
case Builtin::BI__sync_sub_and_fetch_16:
|
||||
case Builtin::BI__sync_and_and_fetch:
|
||||
case Builtin::BI__sync_and_and_fetch_1:
|
||||
case Builtin::BI__sync_and_and_fetch_2:
|
||||
case Builtin::BI__sync_and_and_fetch_4:
|
||||
case Builtin::BI__sync_and_and_fetch_8:
|
||||
case Builtin::BI__sync_and_and_fetch_16:
|
||||
case Builtin::BI__sync_or_and_fetch:
|
||||
case Builtin::BI__sync_or_and_fetch_1:
|
||||
case Builtin::BI__sync_or_and_fetch_2:
|
||||
case Builtin::BI__sync_or_and_fetch_4:
|
||||
case Builtin::BI__sync_or_and_fetch_8:
|
||||
case Builtin::BI__sync_or_and_fetch_16:
|
||||
case Builtin::BI__sync_xor_and_fetch:
|
||||
case Builtin::BI__sync_xor_and_fetch_1:
|
||||
case Builtin::BI__sync_xor_and_fetch_2:
|
||||
case Builtin::BI__sync_xor_and_fetch_4:
|
||||
case Builtin::BI__sync_xor_and_fetch_8:
|
||||
case Builtin::BI__sync_xor_and_fetch_16:
|
||||
case Builtin::BI__sync_val_compare_and_swap:
|
||||
case Builtin::BI__sync_val_compare_and_swap_1:
|
||||
case Builtin::BI__sync_val_compare_and_swap_2:
|
||||
case Builtin::BI__sync_val_compare_and_swap_4:
|
||||
case Builtin::BI__sync_val_compare_and_swap_8:
|
||||
case Builtin::BI__sync_val_compare_and_swap_16:
|
||||
case Builtin::BI__sync_bool_compare_and_swap:
|
||||
case Builtin::BI__sync_bool_compare_and_swap_1:
|
||||
case Builtin::BI__sync_bool_compare_and_swap_2:
|
||||
case Builtin::BI__sync_bool_compare_and_swap_4:
|
||||
case Builtin::BI__sync_bool_compare_and_swap_8:
|
||||
case Builtin::BI__sync_bool_compare_and_swap_16:
|
||||
case Builtin::BI__sync_lock_test_and_set:
|
||||
case Builtin::BI__sync_lock_test_and_set_1:
|
||||
case Builtin::BI__sync_lock_test_and_set_2:
|
||||
case Builtin::BI__sync_lock_test_and_set_4:
|
||||
case Builtin::BI__sync_lock_test_and_set_8:
|
||||
case Builtin::BI__sync_lock_test_and_set_16:
|
||||
case Builtin::BI__sync_lock_release:
|
||||
case Builtin::BI__sync_lock_release_1:
|
||||
case Builtin::BI__sync_lock_release_2:
|
||||
case Builtin::BI__sync_lock_release_4:
|
||||
case Builtin::BI__sync_lock_release_8:
|
||||
case Builtin::BI__sync_lock_release_16:
|
||||
case Builtin::BI__sync_swap:
|
||||
case Builtin::BI__sync_swap_1:
|
||||
case Builtin::BI__sync_swap_2:
|
||||
case Builtin::BI__sync_swap_4:
|
||||
case Builtin::BI__sync_swap_8:
|
||||
case Builtin::BI__sync_swap_16:
|
||||
return SemaBuiltinAtomicOverloaded(move(TheCallResult));
|
||||
case Builtin::BI__atomic_load:
|
||||
return SemaAtomicOpsOverloaded(move(TheCallResult), AtomicExpr::Load);
|
||||
|
@ -794,34 +869,145 @@ Sema::SemaBuiltinAtomicOverloaded(ExprResult TheCallResult) {
|
|||
unsigned BuiltinIndex, NumFixed = 1;
|
||||
switch (BuiltinID) {
|
||||
default: llvm_unreachable("Unknown overloaded atomic builtin!");
|
||||
case Builtin::BI__sync_fetch_and_add: BuiltinIndex = 0; break;
|
||||
case Builtin::BI__sync_fetch_and_sub: BuiltinIndex = 1; break;
|
||||
case Builtin::BI__sync_fetch_and_or: BuiltinIndex = 2; break;
|
||||
case Builtin::BI__sync_fetch_and_and: BuiltinIndex = 3; break;
|
||||
case Builtin::BI__sync_fetch_and_xor: BuiltinIndex = 4; break;
|
||||
case Builtin::BI__sync_fetch_and_add:
|
||||
case Builtin::BI__sync_fetch_and_add_1:
|
||||
case Builtin::BI__sync_fetch_and_add_2:
|
||||
case Builtin::BI__sync_fetch_and_add_4:
|
||||
case Builtin::BI__sync_fetch_and_add_8:
|
||||
case Builtin::BI__sync_fetch_and_add_16:
|
||||
BuiltinIndex = 0;
|
||||
break;
|
||||
|
||||
case Builtin::BI__sync_fetch_and_sub:
|
||||
case Builtin::BI__sync_fetch_and_sub_1:
|
||||
case Builtin::BI__sync_fetch_and_sub_2:
|
||||
case Builtin::BI__sync_fetch_and_sub_4:
|
||||
case Builtin::BI__sync_fetch_and_sub_8:
|
||||
case Builtin::BI__sync_fetch_and_sub_16:
|
||||
BuiltinIndex = 1;
|
||||
break;
|
||||
|
||||
case Builtin::BI__sync_fetch_and_or:
|
||||
case Builtin::BI__sync_fetch_and_or_1:
|
||||
case Builtin::BI__sync_fetch_and_or_2:
|
||||
case Builtin::BI__sync_fetch_and_or_4:
|
||||
case Builtin::BI__sync_fetch_and_or_8:
|
||||
case Builtin::BI__sync_fetch_and_or_16:
|
||||
BuiltinIndex = 2;
|
||||
break;
|
||||
|
||||
case Builtin::BI__sync_fetch_and_and:
|
||||
case Builtin::BI__sync_fetch_and_and_1:
|
||||
case Builtin::BI__sync_fetch_and_and_2:
|
||||
case Builtin::BI__sync_fetch_and_and_4:
|
||||
case Builtin::BI__sync_fetch_and_and_8:
|
||||
case Builtin::BI__sync_fetch_and_and_16:
|
||||
BuiltinIndex = 3;
|
||||
break;
|
||||
|
||||
case Builtin::BI__sync_add_and_fetch: BuiltinIndex = 5; break;
|
||||
case Builtin::BI__sync_sub_and_fetch: BuiltinIndex = 6; break;
|
||||
case Builtin::BI__sync_and_and_fetch: BuiltinIndex = 7; break;
|
||||
case Builtin::BI__sync_or_and_fetch: BuiltinIndex = 8; break;
|
||||
case Builtin::BI__sync_xor_and_fetch: BuiltinIndex = 9; break;
|
||||
case Builtin::BI__sync_fetch_and_xor:
|
||||
case Builtin::BI__sync_fetch_and_xor_1:
|
||||
case Builtin::BI__sync_fetch_and_xor_2:
|
||||
case Builtin::BI__sync_fetch_and_xor_4:
|
||||
case Builtin::BI__sync_fetch_and_xor_8:
|
||||
case Builtin::BI__sync_fetch_and_xor_16:
|
||||
BuiltinIndex = 4;
|
||||
break;
|
||||
|
||||
case Builtin::BI__sync_add_and_fetch:
|
||||
case Builtin::BI__sync_add_and_fetch_1:
|
||||
case Builtin::BI__sync_add_and_fetch_2:
|
||||
case Builtin::BI__sync_add_and_fetch_4:
|
||||
case Builtin::BI__sync_add_and_fetch_8:
|
||||
case Builtin::BI__sync_add_and_fetch_16:
|
||||
BuiltinIndex = 5;
|
||||
break;
|
||||
|
||||
case Builtin::BI__sync_sub_and_fetch:
|
||||
case Builtin::BI__sync_sub_and_fetch_1:
|
||||
case Builtin::BI__sync_sub_and_fetch_2:
|
||||
case Builtin::BI__sync_sub_and_fetch_4:
|
||||
case Builtin::BI__sync_sub_and_fetch_8:
|
||||
case Builtin::BI__sync_sub_and_fetch_16:
|
||||
BuiltinIndex = 6;
|
||||
break;
|
||||
|
||||
case Builtin::BI__sync_and_and_fetch:
|
||||
case Builtin::BI__sync_and_and_fetch_1:
|
||||
case Builtin::BI__sync_and_and_fetch_2:
|
||||
case Builtin::BI__sync_and_and_fetch_4:
|
||||
case Builtin::BI__sync_and_and_fetch_8:
|
||||
case Builtin::BI__sync_and_and_fetch_16:
|
||||
BuiltinIndex = 7;
|
||||
break;
|
||||
|
||||
case Builtin::BI__sync_or_and_fetch:
|
||||
case Builtin::BI__sync_or_and_fetch_1:
|
||||
case Builtin::BI__sync_or_and_fetch_2:
|
||||
case Builtin::BI__sync_or_and_fetch_4:
|
||||
case Builtin::BI__sync_or_and_fetch_8:
|
||||
case Builtin::BI__sync_or_and_fetch_16:
|
||||
BuiltinIndex = 8;
|
||||
break;
|
||||
|
||||
case Builtin::BI__sync_xor_and_fetch:
|
||||
case Builtin::BI__sync_xor_and_fetch_1:
|
||||
case Builtin::BI__sync_xor_and_fetch_2:
|
||||
case Builtin::BI__sync_xor_and_fetch_4:
|
||||
case Builtin::BI__sync_xor_and_fetch_8:
|
||||
case Builtin::BI__sync_xor_and_fetch_16:
|
||||
BuiltinIndex = 9;
|
||||
break;
|
||||
|
||||
case Builtin::BI__sync_val_compare_and_swap:
|
||||
case Builtin::BI__sync_val_compare_and_swap_1:
|
||||
case Builtin::BI__sync_val_compare_and_swap_2:
|
||||
case Builtin::BI__sync_val_compare_and_swap_4:
|
||||
case Builtin::BI__sync_val_compare_and_swap_8:
|
||||
case Builtin::BI__sync_val_compare_and_swap_16:
|
||||
BuiltinIndex = 10;
|
||||
NumFixed = 2;
|
||||
break;
|
||||
|
||||
case Builtin::BI__sync_bool_compare_and_swap:
|
||||
case Builtin::BI__sync_bool_compare_and_swap_1:
|
||||
case Builtin::BI__sync_bool_compare_and_swap_2:
|
||||
case Builtin::BI__sync_bool_compare_and_swap_4:
|
||||
case Builtin::BI__sync_bool_compare_and_swap_8:
|
||||
case Builtin::BI__sync_bool_compare_and_swap_16:
|
||||
BuiltinIndex = 11;
|
||||
NumFixed = 2;
|
||||
ResultType = Context.BoolTy;
|
||||
break;
|
||||
case Builtin::BI__sync_lock_test_and_set: BuiltinIndex = 12; break;
|
||||
|
||||
case Builtin::BI__sync_lock_test_and_set:
|
||||
case Builtin::BI__sync_lock_test_and_set_1:
|
||||
case Builtin::BI__sync_lock_test_and_set_2:
|
||||
case Builtin::BI__sync_lock_test_and_set_4:
|
||||
case Builtin::BI__sync_lock_test_and_set_8:
|
||||
case Builtin::BI__sync_lock_test_and_set_16:
|
||||
BuiltinIndex = 12;
|
||||
break;
|
||||
|
||||
case Builtin::BI__sync_lock_release:
|
||||
case Builtin::BI__sync_lock_release_1:
|
||||
case Builtin::BI__sync_lock_release_2:
|
||||
case Builtin::BI__sync_lock_release_4:
|
||||
case Builtin::BI__sync_lock_release_8:
|
||||
case Builtin::BI__sync_lock_release_16:
|
||||
BuiltinIndex = 13;
|
||||
NumFixed = 0;
|
||||
ResultType = Context.VoidTy;
|
||||
break;
|
||||
case Builtin::BI__sync_swap: BuiltinIndex = 14; break;
|
||||
|
||||
case Builtin::BI__sync_swap:
|
||||
case Builtin::BI__sync_swap_1:
|
||||
case Builtin::BI__sync_swap_2:
|
||||
case Builtin::BI__sync_swap_4:
|
||||
case Builtin::BI__sync_swap_8:
|
||||
case Builtin::BI__sync_swap_16:
|
||||
BuiltinIndex = 14;
|
||||
break;
|
||||
}
|
||||
|
||||
// Now that we know how many fixed arguments we expect, first check that we
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
// RUN: %clang_cc1 %s -emit-llvm -o - -triple=i686-apple-darwin9 | FileCheck %s
|
||||
|
||||
namespace PR11411 {
|
||||
template<typename _Tp> struct Ptr {
|
||||
void f();
|
||||
};
|
||||
|
||||
// CHECK: define linkonce_odr void @_ZN7PR114113PtrIiE1fEv
|
||||
// CHECK-NOT: ret
|
||||
template<typename _Tp> inline void Ptr<_Tp>::f() {
|
||||
int* _refcount;
|
||||
// CHECK: atomicrmw add i32*
|
||||
__sync_fetch_and_add(_refcount, 1);
|
||||
// CHECK-NEXT: ret void
|
||||
}
|
||||
void f(Ptr<int> *a) { a->f(); }
|
||||
}
|
Loading…
Reference in New Issue