xref: /llvm-project/clang/test/Analysis/copypaste/labels.cpp (revision 561f0de6d96eff6efc53e6e8b07bc9408304b381)
1*561f0de6SRaphael Isemann // RUN: %clang_analyze_cc1 -std=gnu++11 -analyzer-checker=alpha.clone.CloneChecker -analyzer-config alpha.clone.CloneChecker:MinimumCloneComplexity=10 -verify %s
278692ea5SArtem Dergachev 
378692ea5SArtem Dergachev // expected-no-diagnostics
478692ea5SArtem Dergachev 
578692ea5SArtem Dergachev 
foo1(int x)678692ea5SArtem Dergachev bool foo1(int x) {
778692ea5SArtem Dergachev   start:
878692ea5SArtem Dergachev   if (x != 3) {
978692ea5SArtem Dergachev     ++x;
1078692ea5SArtem Dergachev     void *ptr = &&start;
1178692ea5SArtem Dergachev     goto start;
1278692ea5SArtem Dergachev   }
1378692ea5SArtem Dergachev   end:
1478692ea5SArtem Dergachev   return false;
1578692ea5SArtem Dergachev }
1678692ea5SArtem Dergachev 
1778692ea5SArtem Dergachev // Targeting a different label with the address-of-label operator.
foo2(int x)1878692ea5SArtem Dergachev bool foo2(int x) {
1978692ea5SArtem Dergachev   start:
2078692ea5SArtem Dergachev   if (x != 3) {
2178692ea5SArtem Dergachev     ++x;
2278692ea5SArtem Dergachev     void *ptr = &&end;
2378692ea5SArtem Dergachev     goto start;
2478692ea5SArtem Dergachev   }
2578692ea5SArtem Dergachev   end:
2678692ea5SArtem Dergachev   return false;
2778692ea5SArtem Dergachev }
2878692ea5SArtem Dergachev 
2978692ea5SArtem Dergachev // Different target label in goto
foo3(int x)3078692ea5SArtem Dergachev bool foo3(int x) {
3178692ea5SArtem Dergachev   start:
3278692ea5SArtem Dergachev   if (x != 3) {
3378692ea5SArtem Dergachev     ++x;
3478692ea5SArtem Dergachev     void *ptr = &&start;
3578692ea5SArtem Dergachev     goto end;
3678692ea5SArtem Dergachev   }
3778692ea5SArtem Dergachev   end:
3878692ea5SArtem Dergachev   return false;
3978692ea5SArtem Dergachev }
4078692ea5SArtem Dergachev 
4178692ea5SArtem Dergachev // FIXME: Can't detect same algorithm as in foo1 but with different label names.
foo4(int x)4278692ea5SArtem Dergachev bool foo4(int x) {
4378692ea5SArtem Dergachev   foo:
4478692ea5SArtem Dergachev   if (x != 3) {
4578692ea5SArtem Dergachev     ++x;
4678692ea5SArtem Dergachev     void *ptr = &&foo;
4778692ea5SArtem Dergachev     goto foo;
4878692ea5SArtem Dergachev   }
4978692ea5SArtem Dergachev   end:
5078692ea5SArtem Dergachev   return false;
5178692ea5SArtem Dergachev }
52