As requested by Jason in the review of the P0482 (char8_t) core language
changes, this patch includes updates to the error messages emitted for
ill-formed cases of array initialization with a string literal. With
these changes, error messages that previously looked something like these:
- "char-array initialized from wide string"
- "wide character array initialized from non-wide string"
- "wide character array initialized from incompatible wide string"
now look like:
- "cannot initialize array of type 'char' from a string literal with
type array of 'short unsigned int'"
- "cannot initialize array of type 'short unsigned int' from a string
literal with type array of 'char'"
- "cannot initialize array of type 'short unsigned int' from a string
literal with type array of 'unsigned int'"
These changes affect both the C and C++ front ends.
These changes have dependencies on the (revised) set of patches
submitted for P0482 (char8_t) and will not apply cleanly without them.
Tested on x86_64-linux.
gcc/c/ChangeLog:
2018-12-26 Tom Honermann <t...@honermann.net>
* c-typeck.c (digest_init): Revised the error message produced for
ill-formed cases of array initialization with a string literal.
gcc/cp/ChangeLog:
2018-12-26 Tom Honermann <t...@honermann.net>
* typeck2.c (digest_init_r): Revised the error message produced for
ill-formed cases of array initialization with a string literal.
gcc/testsuite/ChangeLog:
2018-12-26 Tom Honermann <t...@honermann.net>
* gcc/testsuite/g++.dg/ext/char8_t-init-2.C: Updated the expected
error messages for ill-formed cases of array initialization with a
string literal.
* gcc/testsuite/g++.dg/ext/utf-array-short-wchar.C: Likewise.
* gcc/testsuite/g++.dg/ext/utf-array.C: Likewise.
* gcc/testsuite/g++.dg/ext/utf8-2.C: Likewise.
* gcc/testsuite/gcc.dg/init-string-2.c: Likewise.
* gcc/testsuite/gcc.dg/pr61096-1.c: Likewise.
* gcc/testsuite/gcc.dg/utf-array-short-wchar.c: Likewise.
* gcc/testsuite/gcc.dg/utf-array.c: Likewise.
* gcc/testsuite/gcc.dg/utf8-2.c: Likewise.
Tom.
diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c
index 9d09b8d65fd..4d2129dff2f 100644
--- a/gcc/c/c-typeck.c
+++ b/gcc/c/c-typeck.c
@@ -7447,6 +7447,7 @@ digest_init (location_t init_loc, tree type, tree init, tree origtype,
{
struct c_expr expr;
tree typ2 = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (inside_init)));
+ bool incompat_string_cst = false;
expr.value = inside_init;
expr.original_code = (strict_string ? STRING_CST : ERROR_MARK);
expr.original_type = NULL;
@@ -7464,27 +7465,22 @@ digest_init (location_t init_loc, tree type, tree init, tree origtype,
{
if (typ2 != char_type_node)
{
- error_init (init_loc, "char-array initialized from wide "
- "string");
- return error_mark_node;
+ incompat_string_cst = true;
}
}
- else
+ else if (!comptypes(typ1, typ2))
{
- if (typ2 == char_type_node)
- {
- error_init (init_loc, "wide character array initialized "
- "from non-wide string");
- return error_mark_node;
- }
- else if (!comptypes(typ1, typ2))
- {
- error_init (init_loc, "wide character array initialized "
- "from incompatible wide string");
- return error_mark_node;
- }
+ incompat_string_cst = true;
}
+ if (incompat_string_cst)
+ {
+ error_at (init_loc, "cannot initialize array of type %qT from "
+ "a string literal with type array of %qT",
+ typ1, typ2);
+ return error_mark_node;
+ }
+
if (TYPE_DOMAIN (type) != NULL_TREE
&& TYPE_SIZE (type) != NULL_TREE
&& TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST)
diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c
index 782fd7f9cd5..ae3b53dc001 100644
--- a/gcc/cp/typeck2.c
+++ b/gcc/cp/typeck2.c
@@ -1060,46 +1060,43 @@ digest_init_r (tree type, tree init, int nested, int flags,
&& TREE_CODE (init) == STRING_CST)
{
tree char_type = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (init)));
+ bool incompat_string_cst = false;
- if (TYPE_PRECISION (typ1) == BITS_PER_UNIT)
+ if (typ1 != char_type)
{
- if (typ1 != char8_type_node && char_type == char8_type_node)
+ /* The array element type does not match the initializing string
+ literal element type. This is only allowed when initializing
+ an array of signed char or unsigned char. */
+ if (TYPE_PRECISION (typ1) == BITS_PER_UNIT)
{
- if (complain & tf_error)
- error_at (loc, "char-array initialized from UTF-8 string");
- return error_mark_node;
- }
- else if (typ1 == char8_type_node && char_type == char_type_node)
- {
- if (complain & tf_error)
- error_at (loc, "char8_t-array initialized from ordinary "
- "string");
- return error_mark_node;
+ if (typ1 == char8_type_node)
+ {
+ /* char8_t array initialized with a non-char8_t
+ string literal. */
+ incompat_string_cst = true;
+ }
+ else if (char_type != char_type_node)
+ {
+ /* singed or unsigned char array initialized with a
+ char8_t or wide string literal. */
+ incompat_string_cst = true;
+ }
}
- else if (char_type != char_type_node
- && char_type != char8_type_node)
+ else
{
- if (complain & tf_error)
- error_at (loc, "char-array initialized from wide string");
- return error_mark_node;
+ /* Wide char array initialized with a string literal with a
+ mismatched element type. */
+ incompat_string_cst = true;
}
}
- else
+
+ if (incompat_string_cst)
{
- if (char_type == char_type_node)
- {
- if (complain & tf_error)
- error_at (loc,
- "int-array initialized from non-wide string");
- return error_mark_node;
- }
- else if (char_type != typ1)
- {
- if (complain & tf_error)
- error_at (loc, "int-array initialized from incompatible "
- "wide string");
- return error_mark_node;
- }
+ if (complain & tf_error)
+ error_at (loc, "cannot initialize array of type %qT from "
+ "a string literal with type array of %qT",
+ typ1, char_type);
+ return error_mark_node;
}
if (nested == 2 && !TYPE_DOMAIN (type))
diff --git a/gcc/testsuite/g++.dg/ext/char8_t-init-2.C b/gcc/testsuite/g++.dg/ext/char8_t-init-2.C
index 7a7a3a6b208..c713bc12266 100644
--- a/gcc/testsuite/g++.dg/ext/char8_t-init-2.C
+++ b/gcc/testsuite/g++.dg/ext/char8_t-init-2.C
@@ -21,13 +21,13 @@ const char8_t (&rca4)[2] = u8"x";
const char8_t (&rca5)[2] = u"x"; // { dg-error "invalid initialization of reference of type .const char8_t ....... from expression of type .const char16_t ...." "char8_t" }
char ca1[] = "x";
-char ca2[] = u8"x"; // { dg-error "char-array initialized from UTF-8 string" "char8_t" }
-char8_t ca3[] = "x"; // { dg-error "char8_t-array initialized from ordinary string" "char8_t" }
+char ca2[] = u8"x"; // { dg-error "from a string literal with type array of .char8_t." "char8_t" }
+char8_t ca3[] = "x"; // { dg-error "from a string literal with type array of .char." "char8_t" }
char8_t ca4[] = u8"x";
-char8_t ca5[] = u"x"; // { dg-error "char-array initialized from wide string" "char8_t" }
+char8_t ca5[] = u"x"; // { dg-error "from a string literal with type array of .char16_t." "char8_t" }
signed char sca1[] = "x";
-signed char sca2[] = u8"x"; // { dg-error "char-array initialized from UTF-8 string" "char8_t" }
+signed char sca2[] = u8"x"; // { dg-error "from a string literal with type array of .char8_t." "char8_t" }
unsigned char uca1[] = "x";
-unsigned char uca2[] = u8"x"; // { dg-error "char-array initialized from UTF-8 string" "char8_t" }
+unsigned char uca2[] = u8"x"; // { dg-error "from a string literal with type array of .char8_t." "char8_t" }
diff --git a/gcc/testsuite/g++.dg/ext/utf-array-short-wchar.C b/gcc/testsuite/g++.dg/ext/utf-array-short-wchar.C
index 6e0e4a0c7e9..617e9f0d4bf 100644
--- a/gcc/testsuite/g++.dg/ext/utf-array-short-wchar.C
+++ b/gcc/testsuite/g++.dg/ext/utf-array-short-wchar.C
@@ -4,16 +4,16 @@
/* { dg-options "-fshort-wchar" } */
const char s_0[] = "ab";
-const char s_1[] = u"ab"; /* { dg-error "from wide string" } */
-const char s_2[] = U"ab"; /* { dg-error "from wide string" } */
-const char s_3[] = L"ab"; /* { dg-error "from wide string" } */
+const char s_1[] = u"ab"; /* { dg-error "from a string literal with type array of .char16_t." } */
+const char s_2[] = U"ab"; /* { dg-error "from a string literal with type array of .char32_t." } */
+const char s_3[] = L"ab"; /* { dg-error "from a string literal with type array of .wchar_t." } */
const char s_4[] = u8"ab";
-const char16_t s16_0[] = "ab"; /* { dg-error "from non-wide" } */
+const char16_t s16_0[] = "ab"; /* { dg-error "from a string literal with type array of .char." } */
const char16_t s16_1[] = u"ab";
-const char16_t s16_2[] = U"ab"; /* { dg-error "from incompatible" } */
-const char16_t s16_3[] = L"ab"; /* { dg-error "from incompatible" } */
-const char16_t s16_4[] = u8"ab"; /* { dg-error "from non-wide" } */
+const char16_t s16_2[] = U"ab"; /* { dg-error "from a string literal with type array of .char32_t." } */
+const char16_t s16_3[] = L"ab"; /* { dg-error "from a string literal with type array of .wchar_t." } */
+const char16_t s16_4[] = u8"ab"; /* { dg-error "from a string literal with type array of .char." } */
const char16_t s16_5[0] = u"ab"; /* { dg-error "chars is too long" } */
const char16_t s16_6[1] = u"ab"; /* { dg-error "chars is too long" } */
@@ -21,11 +21,11 @@ const char16_t s16_7[2] = u"ab"; /* { dg-error "chars is too long" } */
const char16_t s16_8[3] = u"ab";
const char16_t s16_9[4] = u"ab";
-const char32_t s32_0[] = "ab"; /* { dg-error "from non-wide" } */
-const char32_t s32_1[] = u"ab"; /* { dg-error "from incompatible" } */
+const char32_t s32_0[] = "ab"; /* { dg-error "from a string literal with type array of .char." } */
+const char32_t s32_1[] = u"ab"; /* { dg-error "from a string literal with type array of .char16_t." } */
const char32_t s32_2[] = U"ab";
-const char32_t s32_3[] = L"ab"; /* { dg-error "from incompatible" } */
-const char32_t s32_4[] = u8"ab"; /* { dg-error "from non-wide" } */
+const char32_t s32_3[] = L"ab"; /* { dg-error "from a string literal with type array of .wchar_t." } */
+const char32_t s32_4[] = u8"ab"; /* { dg-error "from a string literal with type array of .char." } */
const char32_t s32_5[0] = U"ab"; /* { dg-error "chars is too long" } */
const char32_t s32_6[1] = U"ab"; /* { dg-error "chars is too long" } */
@@ -33,8 +33,8 @@ const char32_t s32_7[2] = U"ab"; /* { dg-error "chars is too long" } */
const char32_t s32_8[3] = U"ab";
const char32_t s32_9[4] = U"ab";
-const wchar_t sw_0[] = "ab"; /* { dg-error "from non-wide" } */
-const wchar_t sw_1[] = u"ab"; /* { dg-error "from incompatible" } */
-const wchar_t sw_2[] = U"ab"; /* { dg-error "from incompatible" } */
+const wchar_t sw_0[] = "ab"; /* { dg-error "from a string literal with type array of .char." } */
+const wchar_t sw_1[] = u"ab"; /* { dg-error "from a string literal with type array of .char16_t." } */
+const wchar_t sw_2[] = U"ab"; /* { dg-error "from a string literal with type array of .char32_t." } */
const wchar_t sw_3[] = L"ab";
-const wchar_t sw_4[] = u8"ab"; /* { dg-error "from non-wide" } */
+const wchar_t sw_4[] = u8"ab"; /* { dg-error "from a string literal with type array of .char." } */
diff --git a/gcc/testsuite/g++.dg/ext/utf-array.C b/gcc/testsuite/g++.dg/ext/utf-array.C
index fcdf75d7650..3e77c880963 100644
--- a/gcc/testsuite/g++.dg/ext/utf-array.C
+++ b/gcc/testsuite/g++.dg/ext/utf-array.C
@@ -4,16 +4,16 @@
// { dg-options "" }
const char s_0[] = "ab";
-const char s_1[] = u"ab"; /* { dg-error "from wide string" } */
-const char s_2[] = U"ab"; /* { dg-error "from wide string" } */
-const char s_3[] = L"ab"; /* { dg-error "from wide string" } */
+const char s_1[] = u"ab"; /* { dg-error "from a string literal with type array of .char16_t." } */
+const char s_2[] = U"ab"; /* { dg-error "from a string literal with type array of .char32_t." } */
+const char s_3[] = L"ab"; /* { dg-error "from a string literal with type array of .wchar_t." } */
const char s_4[] = u8"ab";
-const char16_t s16_0[] = "ab"; /* { dg-error "from non-wide" } */
+const char16_t s16_0[] = "ab"; /* { dg-error "from a string literal with type array of .char." } */
const char16_t s16_1[] = u"ab";
-const char16_t s16_2[] = U"ab"; /* { dg-error "from incompatible" } */
-const char16_t s16_3[] = L"ab"; /* { dg-error "from incompatible" } */
-const char16_t s16_4[] = u8"ab"; /* { dg-error "from non-wide" } */
+const char16_t s16_2[] = U"ab"; /* { dg-error "from a string literal with type array of .char32_t." } */
+const char16_t s16_3[] = L"ab"; /* { dg-error "from a string literal with type array of .wchar_t." } */
+const char16_t s16_4[] = u8"ab"; /* { dg-error "from a string literal with type array of .char." } */
const char16_t s16_5[0] = u"ab"; /* { dg-error "chars is too long" } */
const char16_t s16_6[1] = u"ab"; /* { dg-error "chars is too long" } */
@@ -21,11 +21,11 @@ const char16_t s16_7[2] = u"ab"; /* { dg-error "chars is too long" } */
const char16_t s16_8[3] = u"ab";
const char16_t s16_9[4] = u"ab";
-const char32_t s32_0[] = "ab"; /* { dg-error "from non-wide" } */
-const char32_t s32_1[] = u"ab"; /* { dg-error "from incompatible" } */
+const char32_t s32_0[] = "ab"; /* { dg-error "from a string literal with type array of .char." } */
+const char32_t s32_1[] = u"ab"; /* { dg-error "from a string literal with type array of .char16_t." } */
const char32_t s32_2[] = U"ab";
-const char32_t s32_3[] = L"ab"; /* { dg-error "from incompatible" } */
-const char32_t s32_4[] = u8"ab"; /* { dg-error "from non-wide" } */
+const char32_t s32_3[] = L"ab"; /* { dg-error "from a string literal with type array of .wchar_t." } */
+const char32_t s32_4[] = u8"ab"; /* { dg-error "from a string literal with type array of .char." } */
const char32_t s32_5[0] = U"ab"; /* { dg-error "chars is too long" } */
const char32_t s32_6[1] = U"ab"; /* { dg-error "chars is too long" } */
@@ -33,8 +33,8 @@ const char32_t s32_7[2] = U"ab"; /* { dg-error "chars is too long" } */
const char32_t s32_8[3] = U"ab";
const char32_t s32_9[4] = U"ab";
-const wchar_t sw_0[] = "ab"; /* { dg-error "from non-wide" } */
-const wchar_t sw_1[] = u"ab"; /* { dg-error "from incompatible" } */
-const wchar_t sw_2[] = U"ab"; /* { dg-error "from incompatible" } */
+const wchar_t sw_0[] = "ab"; /* { dg-error "from a string literal with type array of .char." } */
+const wchar_t sw_1[] = u"ab"; /* { dg-error "from a string literal with type array of .char16_t." } */
+const wchar_t sw_2[] = U"ab"; /* { dg-error "from a string literal with type array of .char32_t." } */
const wchar_t sw_3[] = L"ab";
-const wchar_t sw_4[] = u8"ab"; /* { dg-error "from non-wide" } */
+const wchar_t sw_4[] = u8"ab"; /* { dg-error "from a string literal with type array of .char." } */
diff --git a/gcc/testsuite/g++.dg/ext/utf8-2.C b/gcc/testsuite/g++.dg/ext/utf8-2.C
index bafe6e8351c..abf60430176 100644
--- a/gcc/testsuite/g++.dg/ext/utf8-2.C
+++ b/gcc/testsuite/g++.dg/ext/utf8-2.C
@@ -2,9 +2,9 @@
// { dg-options "" }
const char s0[] = u8"ab";
-const char16_t s1[] = u8"ab"; // { dg-error "from non-wide" }
-const char32_t s2[] = u8"ab"; // { dg-error "from non-wide" }
-const wchar_t s3[] = u8"ab"; // { dg-error "from non-wide" }
+const char16_t s1[] = u8"ab"; // { dg-error "from a string literal with type array of .char." }
+const char32_t s2[] = u8"ab"; // { dg-error "from a string literal with type array of .char." }
+const wchar_t s3[] = u8"ab"; // { dg-error "from a string literal with type array of .char." }
const char t0[0] = u8"ab"; // { dg-error "chars is too long" }
const char t1[1] = u8"ab"; // { dg-error "chars is too long" }
diff --git a/gcc/testsuite/gcc.dg/init-string-2.c b/gcc/testsuite/gcc.dg/init-string-2.c
index 9efd44b3d2f..9b11073c913 100644
--- a/gcc/testsuite/gcc.dg/init-string-2.c
+++ b/gcc/testsuite/gcc.dg/init-string-2.c
@@ -28,8 +28,8 @@ uchar a8[] = "foo"; /* { dg-error "string constant" "a8" } */
const schar a9[] = "foo"; /* { dg-error "string constant" "a9" } */
short a10[] = L"foo"; /* { dg-error "string constant" "a10" } */
const sshrt a11[] = L"foo"; /* { dg-error "string constant" "a11" } */
-char a12[] = L"foo"; /* { dg-error "from wide string" "a12" } */
-wchar_t a13[] = "foo"; /* { dg-error "non-wide string" "a13" } */
+char a12[] = L"foo"; /* { dg-error "from a string literal with type array of .short unsigned int." "a12" } */
+wchar_t a13[] = "foo"; /* { dg-error "from a string literal with type array of .char." "a13" } */
char b0[] = { "foo" };
const signed char b2[4] = { "foo" };
@@ -43,8 +43,8 @@ uchar b8[] = { "foo" }; /* { dg-error "string constant" "b8" } */
const schar b9[] = { "foo" }; /* { dg-error "string constant" "b9" } */
short b10[] = { L"foo" }; /* { dg-error "string constant" "b10" } */
const sshrt b11[] = { L"foo" }; /* { dg-error "string constant" "b11" } */
-char b12[] = { L"foo" }; /* { dg-error "from wide string" "b12" } */
-wchar_t b13[] = { "foo" }; /* { dg-error "non-wide string" "b13" } */
+char b12[] = { L"foo" }; /* { dg-error "from a string literal with type array of .short unsigned int." "b12" } */
+wchar_t b13[] = { "foo" }; /* { dg-error "from a string literal with type array of .char." "b13" } */
struct s { signed char a[10]; int b; ushrt c[10]; };
diff --git a/gcc/testsuite/gcc.dg/pr61096-1.c b/gcc/testsuite/gcc.dg/pr61096-1.c
index 6678d812eb5..c414d0a472c 100644
--- a/gcc/testsuite/gcc.dg/pr61096-1.c
+++ b/gcc/testsuite/gcc.dg/pr61096-1.c
@@ -19,9 +19,9 @@ struct g
struct f f; /* { dg-warning "invalid use of structure with flexible array member" } */
};
-char w1[] = L"foo"; /* { dg-error "13:char-array initialized from wide string" } */
-__WCHAR_TYPE__ w2[] = "foo"; /* { dg-error "23:wide character array initialized from non-wide string" } */
-__WCHAR_TYPE__ w3[] = U"foo"; /* { dg-error "23:wide character array initialized from incompatible wide string" } */
+char w1[] = L"foo"; /* { dg-error "13:array of type .char. from a string literal with type array of .short unsigned int." } */
+__WCHAR_TYPE__ w2[] = "foo"; /* { dg-error "23:array of type .short unsigned int. from a string literal with type array of .char." } */
+__WCHAR_TYPE__ w3[] = U"foo"; /* { dg-error "23:array of type .short unsigned int. from a string literal with type array of .unsigned int." } */
schar a1[] = "foo"; /* { dg-error "14:array of inappropriate type initialized from string constant" } */
int a2[] = (int[]) { 1 }; /* { dg-warning "12:initializer element is not constant" } */
diff --git a/gcc/testsuite/gcc.dg/utf-array-short-wchar.c b/gcc/testsuite/gcc.dg/utf-array-short-wchar.c
index c5da939f34e..1691bbc0475 100644
--- a/gcc/testsuite/gcc.dg/utf-array-short-wchar.c
+++ b/gcc/testsuite/gcc.dg/utf-array-short-wchar.c
@@ -10,16 +10,16 @@ typedef __CHAR16_TYPE__ char16_t;
typedef __CHAR32_TYPE__ char32_t;
const char s_0[] = "ab";
-const char s_1[] = u"ab"; /* { dg-error "from wide string" } */
-const char s_2[] = U"ab"; /* { dg-error "from wide string" } */
-const char s_3[] = L"ab"; /* { dg-error "from wide string" } */
+const char s_1[] = u"ab"; /* { dg-error "from a string literal with type array of .short unsigned int." } */
+const char s_2[] = U"ab"; /* { dg-error "from a string literal with type array of .unsigned int." } */
+const char s_3[] = L"ab"; /* { dg-error "from a string literal with type array of .short unsigned int." } */
const char s_4[] = u8"ab";
-const char16_t s16_0[] = "ab"; /* { dg-error "from non-wide" } */
+const char16_t s16_0[] = "ab"; /* { dg-error "from a string literal with type array of .char." } */
const char16_t s16_1[] = u"ab";
-const char16_t s16_2[] = U"ab"; /* { dg-error "from incompatible" } */
+const char16_t s16_2[] = U"ab"; /* { dg-error "from a string literal with type array of .unsigned int." } */
const char16_t s16_3[] = L"ab";
-const char16_t s16_4[] = u8"ab"; /* { dg-error "from non-wide" } */
+const char16_t s16_4[] = u8"ab"; /* { dg-error "from a string literal with type array of .char." } */
const char16_t s16_5[0] = u"ab"; /* { dg-warning "chars is too long" } */
const char16_t s16_6[1] = u"ab"; /* { dg-warning "chars is too long" } */
@@ -27,11 +27,11 @@ const char16_t s16_7[2] = u"ab";
const char16_t s16_8[3] = u"ab";
const char16_t s16_9[4] = u"ab";
-const char32_t s32_0[] = "ab"; /* { dg-error "from non-wide" } */
-const char32_t s32_1[] = u"ab"; /* { dg-error "from incompatible" } */
+const char32_t s32_0[] = "ab"; /* { dg-error "from a string literal with type array of .char." } */
+const char32_t s32_1[] = u"ab"; /* { dg-error "from a string literal with type array of .short unsigned int." } */
const char32_t s32_2[] = U"ab";
-const char32_t s32_3[] = L"ab"; /* { dg-error "from incompatible" } */
-const char32_t s32_4[] = u8"ab"; /* { dg-error "from non-wide" } */
+const char32_t s32_3[] = L"ab"; /* { dg-error "from a string literal with type array of .short unsigned int." } */
+const char32_t s32_4[] = u8"ab"; /* { dg-error "from a string literal with type array of .char." } */
const char32_t s32_5[0] = U"ab"; /* { dg-warning "chars is too long" } */
const char32_t s32_6[1] = U"ab"; /* { dg-warning "chars is too long" } */
@@ -39,8 +39,8 @@ const char32_t s32_7[2] = U"ab"; /* { dg-warning "chars is too long" "" { target
const char32_t s32_8[3] = U"ab"; /* { dg-warning "chars is too long" "" { target "m32c-*-*" } } */
const char32_t s32_9[4] = U"ab"; /* { dg-warning "chars is too long" "" { target "m32c-*-*" } } */
-const wchar_t sw_0[] = "ab"; /* { dg-error "from non-wide" } */
+const wchar_t sw_0[] = "ab"; /* { dg-error "from a string literal with type array of .char." } */
const wchar_t sw_1[] = u"ab";
-const wchar_t sw_2[] = U"ab"; /* { dg-error "from incompatible" } */
+const wchar_t sw_2[] = U"ab"; /* { dg-error "from a string literal with type array of .unsigned int." } */
const wchar_t sw_3[] = L"ab";
-const wchar_t sw_4[] = u8"ab"; /* { dg-error "from non-wide" } */
+const wchar_t sw_4[] = u8"ab"; /* { dg-error "from a string literal with type array of .char." } */
diff --git a/gcc/testsuite/gcc.dg/utf-array.c b/gcc/testsuite/gcc.dg/utf-array.c
index 1d864220c98..da6a0c9233a 100644
--- a/gcc/testsuite/gcc.dg/utf-array.c
+++ b/gcc/testsuite/gcc.dg/utf-array.c
@@ -10,16 +10,16 @@ typedef __CHAR16_TYPE__ char16_t;
typedef __CHAR32_TYPE__ char32_t;
const char s_0[] = "ab";
-const char s_1[] = u"ab"; /* { dg-error "from wide string" } */
-const char s_2[] = U"ab"; /* { dg-error "from wide string" } */
-const char s_3[] = L"ab"; /* { dg-error "from wide string" } */
+const char s_1[] = u"ab"; /* { dg-error "from a string literal with type array of .short unsigned int." } */
+const char s_2[] = U"ab"; /* { dg-error "from a string literal with type array of .unsigned int." } */
+const char s_3[] = L"ab"; /* { dg-error "from a string literal with type array of .int." } */
const char s_4[] = u8"ab";
-const char16_t s16_0[] = "ab"; /* { dg-error "from non-wide" } */
+const char16_t s16_0[] = "ab"; /* { dg-error "from a string literal with type array of .char." } */
const char16_t s16_1[] = u"ab";
-const char16_t s16_2[] = U"ab"; /* { dg-error "from incompatible" } */
-const char16_t s16_3[] = L"ab"; /* { dg-error "from incompatible" "" { target { ! wchar_t_char16_t_compatible } } } */
-const char16_t s16_4[] = u8"ab"; /* { dg-error "from non-wide" } */
+const char16_t s16_2[] = U"ab"; /* { dg-error "from a string literal with type array of .unsigned int." } */
+const char16_t s16_3[] = L"ab"; /* { dg-error "from a string literal with type array of .int." "" { target { ! wchar_t_char16_t_compatible } } } */
+const char16_t s16_4[] = u8"ab"; /* { dg-error "from a string literal with type array of .char." } */
const char16_t s16_5[0] = u"ab"; /* { dg-warning "chars is too long" } */
const char16_t s16_6[1] = u"ab"; /* { dg-warning "chars is too long" } */
@@ -27,11 +27,11 @@ const char16_t s16_7[2] = u"ab";
const char16_t s16_8[3] = u"ab";
const char16_t s16_9[4] = u"ab";
-const char32_t s32_0[] = "ab"; /* { dg-error "from non-wide" } */
-const char32_t s32_1[] = u"ab"; /* { dg-error "from incompatible" } */
+const char32_t s32_0[] = "ab"; /* { dg-error "from a string literal with type array of .char." } */
+const char32_t s32_1[] = u"ab"; /* { dg-error "from a string literal with type array of .short unsigned int." } */
const char32_t s32_2[] = U"ab";
-const char32_t s32_3[] = L"ab"; /* { dg-error "from incompatible" "" { target { ! wchar_t_char32_t_compatible } } } */
-const char32_t s32_4[] = u8"ab"; /* { dg-error "from non-wide" } */
+const char32_t s32_3[] = L"ab"; /* { dg-error "from a string literal with type array of .int." "" { target { ! wchar_t_char32_t_compatible } } } */
+const char32_t s32_4[] = u8"ab"; /* { dg-error "from a string literal with type array of .char." } */
const char32_t s32_5[0] = U"ab"; /* { dg-warning "chars is too long" } */
const char32_t s32_6[1] = U"ab"; /* { dg-warning "chars is too long" } */
@@ -39,8 +39,8 @@ const char32_t s32_7[2] = U"ab"; /* { dg-warning "chars is too long" "" { target
const char32_t s32_8[3] = U"ab"; /* { dg-warning "chars is too long" "" { target "m32c-*-*" } } */
const char32_t s32_9[4] = U"ab"; /* { dg-warning "chars is too long" "" { target "m32c-*-*" } } */
-const wchar_t sw_0[] = "ab"; /* { dg-error "from non-wide" } */
-const wchar_t sw_1[] = u"ab"; /* { dg-error "from incompatible" "" { target { ! wchar_t_char16_t_compatible } } } */
-const wchar_t sw_2[] = U"ab"; /* { dg-error "from incompatible" "" { target { ! wchar_t_char32_t_compatible } } } */
+const wchar_t sw_0[] = "ab"; /* { dg-error "from a string literal with type array of .char." } */
+const wchar_t sw_1[] = u"ab"; /* { dg-error "from a string literal with type array of .short unsigned int." "" { target { ! wchar_t_char16_t_compatible } } } */
+const wchar_t sw_2[] = U"ab"; /* { dg-error "from a string literal with type array of .unsigned int." "" { target { ! wchar_t_char32_t_compatible } } } */
const wchar_t sw_3[] = L"ab";
-const wchar_t sw_4[] = u8"ab"; /* { dg-error "from non-wide" } */
+const wchar_t sw_4[] = u8"ab"; /* { dg-error "from a string literal with type array of .char." } */
diff --git a/gcc/testsuite/gcc.dg/utf8-2.c b/gcc/testsuite/gcc.dg/utf8-2.c
index f3b83fe3341..d96b15dccb7 100644
--- a/gcc/testsuite/gcc.dg/utf8-2.c
+++ b/gcc/testsuite/gcc.dg/utf8-2.c
@@ -8,9 +8,9 @@ typedef __CHAR16_TYPE__ char16_t;
typedef __CHAR32_TYPE__ char32_t;
const char s0[] = u8"ab";
-const char16_t s1[] = u8"ab"; /* { dg-error "from non-wide" } */
-const char32_t s2[] = u8"ab"; /* { dg-error "from non-wide" } */
-const wchar_t s3[] = u8"ab"; /* { dg-error "from non-wide" } */
+const char16_t s1[] = u8"ab"; /* { dg-error "from a string literal with type array of .char." } */
+const char32_t s2[] = u8"ab"; /* { dg-error "from a string literal with type array of .char." } */
+const wchar_t s3[] = u8"ab"; /* { dg-error "from a string literal with type array of .char." } */
const char t0[0] = u8"ab"; /* { dg-warning "chars is too long" } */
const char t1[1] = u8"ab"; /* { dg-warning "chars is too long" } */