forked from OSchip/llvm-project
Clang :: Sema/wchar.c has long been failing on Solaris:
error: 'error' diagnostics expected but not seen: File /vol/llvm/src/clang/local/test/Sema/wchar.c Line 22: initializing wide char array with non-wide string literal error: 'error' diagnostics seen but not expected: File /vol/llvm/src/clang/local/test/Sema/wchar.c Line 20: array initializer must be an initializer list File /vol/llvm/src/clang/local/test/Sema/wchar.c Line 22: array initializer must be an initializer list It turns out the definition is wrong, as can be seen in GCC's gcc/config/sol2.h: /* wchar_t is called differently in <wchar.h> for 32 and 64-bit compilations. This is called for by SCD 2.4.1, p. 6-83, Figure 6-65 (32-bit) and p. 6P-10, Figure 6.38 (64-bit). */ #undef WCHAR_TYPE #define WCHAR_TYPE (TARGET_64BIT ? "int" : "long int") The following patch implements this, and at the same time corrects the wint_t definition which is the same: /* Same for wint_t. See SCD 2.4.1, p. 6-83, Figure 6-66 (32-bit). There's no corresponding 64-bit definition, but this is what Solaris 8 <iso/wchar_iso.h> uses. */ #undef WINT_TYPE #define WINT_TYPE (TARGET_64BIT ? "int" : "long int") Clang :: Preprocessor/wchar_t.c and Clang :: Sema/format-strings.c need to be adjusted to account for that. Tested on i386-pc-solaris2.11, x86_64-pc-solaris2.11, and x86_64-pc-linux-gnu. Differential Revision: https://reviews.llvm.org/D62944 llvm-svn: 363612
This commit is contained in:
parent
2d26cf37d7
commit
abccb1ad89
|
@ -632,7 +632,11 @@ protected:
|
|||
public:
|
||||
SolarisTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
|
||||
: OSTargetInfo<Target>(Triple, Opts) {
|
||||
// FIXME: WIntType should be SignedLong
|
||||
if (this->PointerWidth == 64) {
|
||||
this->WCharType = this->WIntType = this->SignedInt;
|
||||
} else {
|
||||
this->WCharType = this->WIntType = this->SignedLong;
|
||||
}
|
||||
switch (Triple.getArch()) {
|
||||
default:
|
||||
break;
|
||||
|
|
|
@ -1,8 +1,13 @@
|
|||
// RUN: %clang_cc1 -triple i386-pc-solaris -dM -E %s -o - | FileCheck %s -check-prefix CHECK-SOLARIS
|
||||
// CHECK-SOLARIS-DAG: #define __WCHAR_MAX__ 2147483647
|
||||
// CHECK-SOLARIS-DAG: #define __WCHAR_TYPE__ int
|
||||
// CHECK-SOLARIS-DAG: #define __WCHAR_TYPE__ long int
|
||||
// CHECK-SOLARIS-NOT: #define __WCHAR_UNSIGNED__ 0
|
||||
|
||||
// RUN: %clang_cc1 -triple x86_64-pc-solaris -dM -E %s -o - | FileCheck %s -check-prefix CHECK-SOLARIS64
|
||||
// CHECK-SOLARIS64-DAG: #define __WCHAR_MAX__ 2147483647
|
||||
// CHECK-SOLARIS64-DAG: #define __WCHAR_TYPE__ int
|
||||
// CHECK-SOLARIS64-NOT: #define __WCHAR_UNSIGNED__ 0
|
||||
|
||||
// RUN: %clang_cc1 -triple avr-unknown-unknown -fwchar-type=int -fsigned-wchar -dM -E %s -o - | FileCheck %s -check-prefix CHECK-AVR
|
||||
// CHECK-AVR-DAG: #define __WCHAR_MAX__ 32767
|
||||
// CHECK-AVR-DAG: #define __WCHAR_TYPE__ int
|
||||
|
|
|
@ -329,7 +329,11 @@ void test_unicode_conversions(wchar_t *s) {
|
|||
printf("%S", s); // no-warning
|
||||
printf("%s", s); // expected-warning{{format specifies type 'char *' but the argument has type 'wchar_t *'}}
|
||||
printf("%C", s[0]); // no-warning
|
||||
#if defined(__sun) && !defined(__LP64__)
|
||||
printf("%c", s[0]); // expected-warning{{format specifies type 'int' but the argument has type 'wchar_t' (aka 'long')}}
|
||||
#else
|
||||
printf("%c", s[0]);
|
||||
#endif
|
||||
// FIXME: This test reports inconsistent results. On Windows, '%C' expects
|
||||
// 'unsigned short'.
|
||||
// printf("%C", 10);
|
||||
|
@ -401,7 +405,7 @@ void bug7377_bad_length_mod_usage() {
|
|||
void pr7981(wint_t c, wchar_t c2) {
|
||||
printf("%lc", c); // no-warning
|
||||
printf("%lc", 1.0); // expected-warning{{the argument has type 'double'}}
|
||||
#if __WINT_WIDTH__ == 32
|
||||
#if __WINT_WIDTH__ == 32 && !(defined(__sun) && !defined(__LP64__))
|
||||
printf("%lc", (char) 1); // no-warning
|
||||
#else
|
||||
printf("%lc", (char) 1); // expected-warning{{the argument has type 'char'}}
|
||||
|
|
|
@ -9,7 +9,11 @@ typedef __WCHAR_TYPE__ wchar_t;
|
|||
#elif defined(__arm) || defined(__aarch64__)
|
||||
#define WCHAR_T_TYPE unsigned int
|
||||
#elif defined(__sun)
|
||||
#define WCHAR_T_TYPE long
|
||||
#if defined(__LP64__)
|
||||
#define WCHAR_T_TYPE int
|
||||
#else
|
||||
#define WCHAR_T_TYPE long
|
||||
#endif
|
||||
#else /* Solaris. */
|
||||
#define WCHAR_T_TYPE int
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue