Add call checker to report error more granulary if possible

This, however, works only for calls of 'synchronized' only. Thus, it
does not support inline functions of any kind.
This commit is contained in:
Ilmir Usmanov
2018-09-28 21:20:40 +03:00
parent 281f09f077
commit 9af7316845
21 changed files with 327 additions and 86 deletions
@@ -0,0 +1,55 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER, -USELESS_IS_CHECK
// SKIP_TXT
val lock = Any()
fun builder(c: suspend () -> Unit) {}
suspend fun getLock() = lock
suspend fun suspensionPoint() {}
fun test() {
builder {
synchronized(lock) {
<!SUSPENSION_POINT_INSIDE_SYNCHRONIZED!>suspensionPoint<!>()
}
synchronized(lock) label@{
<!SUSPENSION_POINT_INSIDE_SYNCHRONIZED!>suspensionPoint<!>()
}
synchronized(lock, { <!SUSPENSION_POINT_INSIDE_SYNCHRONIZED!>suspensionPoint<!>() })
synchronized(getLock()) {
println("")
}
synchronized(suspend { getLock() } ()) {
println("")
}
synchronized(run { getLock() }) {
println("")
}
}
}
suspend fun run() {
synchronized(lock) {
<!SUSPENSION_POINT_INSIDE_SYNCHRONIZED!>suspensionPoint<!>()
}
}
suspend fun ifWhenAndOtherNonsence() {
synchronized(lock) {
if (lock == Any()) {
when (1) {
is Int -> {
return@synchronized 1 + <!SUSPENSION_POINT_INSIDE_SYNCHRONIZED!>returnsInt<!>()
}
else -> {}
}
} else {}
}
}
suspend fun returnsInt(): Int = 0
@@ -0,0 +1,56 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER, -USELESS_IS_CHECK
// !LANGUAGE: +NewInference
// SKIP_TXT
val lock = Any()
fun builder(c: suspend () -> Unit) {}
suspend fun getLock() = lock
suspend fun suspensionPoint() {}
fun test() {
builder {
synchronized(lock) {
<!SUSPENSION_POINT_INSIDE_SYNCHRONIZED!>suspensionPoint<!>()
}
synchronized(lock) label@{
<!SUSPENSION_POINT_INSIDE_SYNCHRONIZED!>suspensionPoint<!>()
}
synchronized(lock, { <!SUSPENSION_POINT_INSIDE_SYNCHRONIZED!>suspensionPoint<!>() })
synchronized(getLock()) {
println("")
}
synchronized(suspend { getLock() } ()) {
println("")
}
synchronized(run { getLock() }) {
println("")
}
}
}
suspend fun run() {
synchronized(lock) {
<!SUSPENSION_POINT_INSIDE_SYNCHRONIZED!>suspensionPoint<!>()
}
}
suspend fun ifWhenAndOtherNonsence() {
synchronized(lock) {
if (lock == Any()) {
when (1) {
is Int -> {
return@synchronized 1 + <!SUSPENSION_POINT_INSIDE_SYNCHRONIZED!>returnsInt<!>()
}
else -> {}
}
} else {}
}
}
suspend fun returnsInt(): Int = 0