| // RUN: %clang_analyze_cc1 -triple x86_64-unknown-linux -analyzer-checker=alpha.clone.CloneChecker -analyzer-config alpha.clone.CloneChecker:MinimumCloneComplexity=10 -verify %s |
| |
| // expected-no-diagnostics |
| |
| int foo1(int src) { |
| int dst = src; |
| if (src < 100 && src > 0) { |
| |
| asm ("mov %1, %0\n\t" |
| "add $1, %0" |
| : "=r" (dst) |
| : "r" (src)); |
| |
| } |
| return dst; |
| } |
| |
| // Identical to foo1 except that it adds two instead of one, so it's no clone. |
| int foo2(int src) { |
| int dst = src; |
| if (src < 100 && src > 0) { |
| |
| asm ("mov %1, %0\n\t" |
| "add $2, %0" |
| : "=r" (dst) |
| : "r" (src)); |
| |
| } |
| return dst; |
| } |
| |
| // Identical to foo1 except that its a volatile asm statement, so it's no clone. |
| int foo3(int src) { |
| int dst = src; |
| if (src < 100 && src > 0) { |
| |
| asm volatile ("mov %1, %0\n\t" |
| "add $1, %0" |
| : "=r" (dst) |
| : "r" (src)); |
| |
| } |
| return dst; |
| } |