189a1d03eSRichard // RUN: %check_clang_tidy %s bugprone-branch-clone %t -- -- -std=c++17
289a1d03eSRichard 
389a1d03eSRichard void handle(int);
489a1d03eSRichard 
589a1d03eSRichard template <unsigned Index>
shouldFail()689a1d03eSRichard void shouldFail() {
789a1d03eSRichard   if constexpr (Index == 0) {
8*2b51c8cdSDonát Nagy     // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: repeated branch body in conditional chain [bugprone-branch-clone]
989a1d03eSRichard     handle(0);
1089a1d03eSRichard   } else if constexpr (Index == 1) {
1189a1d03eSRichard     handle(1);
1289a1d03eSRichard   } else {
1389a1d03eSRichard     handle(0);
1489a1d03eSRichard   }
1589a1d03eSRichard }
1689a1d03eSRichard 
1789a1d03eSRichard template <unsigned Index>
shouldPass()1889a1d03eSRichard void shouldPass() {
1989a1d03eSRichard   if constexpr (Index == 0) {
2089a1d03eSRichard     handle(0);
2189a1d03eSRichard   } else if constexpr (Index == 1) {
2289a1d03eSRichard     handle(1);
2389a1d03eSRichard   } else {
2489a1d03eSRichard     handle(2);
2589a1d03eSRichard   }
2689a1d03eSRichard }
2789a1d03eSRichard 
shouldFailNonTemplate()2889a1d03eSRichard void shouldFailNonTemplate() {
2989a1d03eSRichard   constexpr unsigned Index = 1;
3089a1d03eSRichard   if constexpr (Index == 0) {
31*2b51c8cdSDonát Nagy     // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: repeated branch body in conditional chain [bugprone-branch-clone]
3289a1d03eSRichard     handle(0);
3389a1d03eSRichard   } else if constexpr (Index == 1) {
3489a1d03eSRichard     handle(1);
3589a1d03eSRichard   } else {
3689a1d03eSRichard     handle(0);
3789a1d03eSRichard   }
3889a1d03eSRichard }
3989a1d03eSRichard 
shouldPassNonTemplate()4089a1d03eSRichard void shouldPassNonTemplate() {
4189a1d03eSRichard   constexpr unsigned Index = 1;
4289a1d03eSRichard   if constexpr (Index == 0) {
4389a1d03eSRichard     handle(0);
4489a1d03eSRichard   } else if constexpr (Index == 1) {
4589a1d03eSRichard     handle(1);
4689a1d03eSRichard   } else {
4789a1d03eSRichard     handle(2);
4889a1d03eSRichard   }
4989a1d03eSRichard }
5089a1d03eSRichard 
run()5189a1d03eSRichard void run() {
5289a1d03eSRichard     shouldFail<0>();
5389a1d03eSRichard     shouldFail<1>();
5489a1d03eSRichard     shouldFail<2>();
5589a1d03eSRichard     shouldPass<0>();
5689a1d03eSRichard     shouldPass<1>();
5789a1d03eSRichard     shouldPass<2>();
5889a1d03eSRichard }
59