1*67e74705SXin Li // RUN: not %clang_cc1 -fsyntax-only -fmessage-length 75 -o /dev/null -x c < %s 2>&1 | FileCheck %s -strict-whitespace 2*67e74705SXin Li // REQUIRES: utf8-capable-terminal 3*67e74705SXin Li 4*67e74705SXin Li // Test case for the text diagnostics source column conversion crash. 5*67e74705SXin Li 6*67e74705SXin Li // This test case tries to check the error diagnostic message printer, which is 7*67e74705SXin Li // responsible to create the code snippet shorter than the message-length (in 8*67e74705SXin Li // number of columns.) 9*67e74705SXin Li // 10*67e74705SXin Li // The error diagnostic message printer should be able to handle the non-ascii 11*67e74705SXin Li // characters without any segmentation fault or assertion failure. If your 12*67e74705SXin Li // changes to clang frontend crashes this case, it is likely that you are mixing 13*67e74705SXin Li // column index with byte index which are two totally different concepts. 14*67e74705SXin Li 15*67e74705SXin Li // NOTE: This file is encoded in UTF-8 and intentionally contains some 16*67e74705SXin Li // non-ASCII characters. 17*67e74705SXin Li 18*67e74705SXin Li __attribute__((format(printf, 1, 2))) 19*67e74705SXin Li extern int printf(const char *fmt, ...); 20*67e74705SXin Li 21*67e74705SXin Li void test1(Unknown* b); // αααα αααα αααα αααα αααα αααα αααα αααα αααα αααα αααα 22*67e74705SXin Li // CHECK: unknown type name 'Unknown' 23*67e74705SXin Li // CHECK-NEXT: void test1(Unknown* b); // αααα αααα αααα αααα αααα αααα αααα ααα... 24*67e74705SXin Li // CHECK-NEXT: {{^ \^$}} 25*67e74705SXin Li 26*67e74705SXin Li void test2(Unknown* b); // αααα αααα αααα αααα αααα αααα αααα αααα αααα 27*67e74705SXin Li 28*67e74705SXin Li // CHECK: unknown type name 'Unknown' 29*67e74705SXin Li // CHECK-NEXT: void test2(Unknown* b); // αααα αααα αααα αααα αααα αααα αααα αααα αααα 30*67e74705SXin Li // CHECK-NEXT: {{^ \^$}} 31*67e74705SXin Li test3()32*67e74705SXin Livoid test3() { 33*67e74705SXin Li /* αααα αααα αααα αααα αααα αααα αααα αααα αααα αααα */ printf("%d", "s"); 34*67e74705SXin Li } 35*67e74705SXin Li // CHECK: format specifies type 'int' but the argument has 36*67e74705SXin Li // CHECK: type 'char *' 37*67e74705SXin Li // CHECK-NEXT: ...αααα αααα αααα αααα αααα αααα αααα αααα αααα */ printf("%d", "s"); 38*67e74705SXin Li // CHECK-NEXT: {{^ ~~ \^~~$}} 39*67e74705SXin Li // CHECK-NEXT: {{^ %s$}} 40