blob: 5963ede392aff3b10b2dd54674a5f8b684f1658a [file] [log] [blame]
Douglas Gregor53afad52011-07-29 01:08:54 +00001// RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck -check-prefix=C %s
2// RUN: %clang_cc1 -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck -check-prefix=C %s
Richard Smith762bb9d2011-10-13 22:29:44 +00003// RUN: %clang_cc1 -x c++ -std=c++11 -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck -check-prefix=CPP0X %s
Douglas Gregor53afad52011-07-29 01:08:54 +00004
5#include <stddef.h>
Nico Weber59705ae2010-10-09 00:27:47 +00006
7int main() {
Douglas Gregor53afad52011-07-29 01:08:54 +00008 // CHECK-C: store i8 97
9 // CHECK-CPP0X: store i8 97
Nico Weber59705ae2010-10-09 00:27:47 +000010 char a = 'a';
11
12 // Should pick second character.
Douglas Gregor53afad52011-07-29 01:08:54 +000013 // CHECK-C: store i8 98
14 // CHECK-CPP0X: store i8 98
Nico Weber59705ae2010-10-09 00:27:47 +000015 char b = 'ab';
16
Douglas Gregor53afad52011-07-29 01:08:54 +000017 // CHECK-C: store i32 97
18 // CHECK-CPP0X: store i32 97
Nico Weber59705ae2010-10-09 00:27:47 +000019 wchar_t wa = L'a';
20
21 // Should pick second character.
Douglas Gregor53afad52011-07-29 01:08:54 +000022 // CHECK-C: store i32 98
23 // CHECK-CPP0X: store i32 98
Nico Weber59705ae2010-10-09 00:27:47 +000024 wchar_t wb = L'ab';
25
Douglas Gregor53afad52011-07-29 01:08:54 +000026#if __cplusplus >= 201103L
27 // CHECK-CPP0X: store i16 97
Douglas Gregor5cee1192011-07-27 05:40:30 +000028 char16_t ua = u'a';
29
30 // Should pick second character.
Douglas Gregor53afad52011-07-29 01:08:54 +000031 // CHECK-CPP0X: store i16 98
Douglas Gregor5cee1192011-07-27 05:40:30 +000032 char16_t ub = u'ab';
33
Douglas Gregor53afad52011-07-29 01:08:54 +000034 // CHECK-CPP0X: store i32 97
Douglas Gregor5cee1192011-07-27 05:40:30 +000035 char32_t Ua = U'a';
36
37 // Should pick second character.
Douglas Gregor53afad52011-07-29 01:08:54 +000038 // CHECK-CPP0X: store i32 98
Douglas Gregor5cee1192011-07-27 05:40:30 +000039 char32_t Ub = U'ab';
Douglas Gregor53afad52011-07-29 01:08:54 +000040#endif
Douglas Gregor5cee1192011-07-27 05:40:30 +000041
Nico Weber59705ae2010-10-09 00:27:47 +000042 // Should pick last character and store its lowest byte.
43 // This does not match gcc, which takes the last character, converts it to
44 // utf8, and then picks the second-lowest byte of that (they probably store
45 // the utf8 in uint16_ts internally and take the lower byte of that).
Douglas Gregor53afad52011-07-29 01:08:54 +000046 // CHECK-C: store i8 48
47 // CHECK-CPP0X: store i8 48
Nico Weber59705ae2010-10-09 00:27:47 +000048 char c = '\u1120\u0220\U00102030';
49
Douglas Gregor53afad52011-07-29 01:08:54 +000050 // CHECK-C: store i32 61451
51 // CHECK-CPP0X: store i32 61451
Nico Weber59705ae2010-10-09 00:27:47 +000052 wchar_t wc = L'\uF00B';
53
Douglas Gregor53afad52011-07-29 01:08:54 +000054#if __cplusplus >= 201103L
Douglas Gregor5cee1192011-07-27 05:40:30 +000055 // -4085 == 0xf00b
Douglas Gregor53afad52011-07-29 01:08:54 +000056 // CHECK-CPP0X: store i16 -4085
Douglas Gregor5cee1192011-07-27 05:40:30 +000057 char16_t uc = u'\uF00B';
58
Douglas Gregor53afad52011-07-29 01:08:54 +000059 // CHECK-CPP0X: store i32 61451
Douglas Gregor5cee1192011-07-27 05:40:30 +000060 char32_t Uc = U'\uF00B';
Douglas Gregor53afad52011-07-29 01:08:54 +000061#endif
Douglas Gregor5cee1192011-07-27 05:40:30 +000062
Douglas Gregor53afad52011-07-29 01:08:54 +000063 // CHECK-C: store i32 1110027
64 // CHECK-CPP0X: store i32 1110027
Nico Weber59705ae2010-10-09 00:27:47 +000065 wchar_t wd = L'\U0010F00B';
66
Douglas Gregor53afad52011-07-29 01:08:54 +000067#if __cplusplus >= 201103L
Douglas Gregor5cee1192011-07-27 05:40:30 +000068 // Should take lower word of the 4byte UNC sequence. This does not match
69 // gcc. I don't understand what gcc does (it looks like it converts to utf16,
70 // then takes the second (!) utf16 word, swaps the lower two nibbles, and
71 // stores that?).
Douglas Gregor53afad52011-07-29 01:08:54 +000072 // CHECK-CPP0X: store i16 -4085
Douglas Gregor5cee1192011-07-27 05:40:30 +000073 char16_t ud = u'\U0010F00B'; // has utf16 encoding dbc8 dcb0
74
Douglas Gregor53afad52011-07-29 01:08:54 +000075 // CHECK-CPP0X: store i32 1110027
Douglas Gregor5cee1192011-07-27 05:40:30 +000076 char32_t Ud = U'\U0010F00B';
Douglas Gregor53afad52011-07-29 01:08:54 +000077#endif
Douglas Gregor5cee1192011-07-27 05:40:30 +000078
Nico Weber59705ae2010-10-09 00:27:47 +000079 // Should pick second character.
Douglas Gregor53afad52011-07-29 01:08:54 +000080 // CHECK-C: store i32 1110027
81 // CHECK-CPP0X: store i32 1110027
Nico Weber59705ae2010-10-09 00:27:47 +000082 wchar_t we = L'\u1234\U0010F00B';
Douglas Gregor5cee1192011-07-27 05:40:30 +000083
Douglas Gregor53afad52011-07-29 01:08:54 +000084#if __cplusplus >= 201103L
Douglas Gregor5cee1192011-07-27 05:40:30 +000085 // Should pick second character.
Douglas Gregor53afad52011-07-29 01:08:54 +000086 // CHECK-CPP0X: store i16 -4085
Douglas Gregor5cee1192011-07-27 05:40:30 +000087 char16_t ue = u'\u1234\U0010F00B';
88
89 // Should pick second character.
Douglas Gregor53afad52011-07-29 01:08:54 +000090 // CHECK-CPP0X: store i32 1110027
Douglas Gregor5cee1192011-07-27 05:40:30 +000091 char32_t Ue = U'\u1234\U0010F00B';
Douglas Gregor53afad52011-07-29 01:08:54 +000092#endif
Nico Weber59705ae2010-10-09 00:27:47 +000093}