]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/58781 (Unicode strings broken in a strange way)
authorEdward Smith-Rowland <3dw4rd@verizon.net>
Tue, 1 Jul 2014 03:13:17 +0000 (03:13 +0000)
committerEdward Smith-Rowland <emsr@gcc.gnu.org>
Tue, 1 Jul 2014 03:13:17 +0000 (03:13 +0000)
cp/

2014-06-28  Edward Smith-Rowland  <3dw4rd@verizon.net>

PR c++/58781
PR c++/60249
PR c++/59867
* parser.c (cp_parser_userdef_string_literal()): Take a tree
not a cp_token*. (cp_parser_string_literal(): Don't hack
the token stream!

testsuite/

2014-06-28  Edward Smith-Rowland  <3dw4rd@verizon.net>

PR c++/58781
PR c++/60249
PR c++/59867
* testsuite/g++.dg/cpp0x/pr58781.C: New.
* testsuite/g++.dg/cpp0x/pr60249.C: New.
* testsuite/g++.dg/cpp1y/pr59867.C: New.

From-SVN: r212186

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/pr58781.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp0x/pr60249.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp1y/pr59867.C [new file with mode: 0644]

index cc9883331083feaad0d9184b46afd8c5d0878999..ce67fcd7aa8e1654d9c43b79f6a309ba839238ab 100644 (file)
@@ -1,3 +1,12 @@
+2014-06-30  Edward Smith-Rowland  <3dw4rd@verizon.net>
+
+       PR c++/58781
+       PR c++/60249
+       PR c++/59867
+       * parser.c (cp_parser_userdef_string_literal()): Take a tree
+       not a cp_token*. (cp_parser_string_literal(): Don't hack
+       the token stream!
+
 2014-06-30  Jason Merrill  <jason@redhat.com>
 
        PR c++/61659
index 013fc6ecd08301e04b8814931c7aa45090429dec..8ff57c7658e86dd62e31807a0ab063c09e9d4093 100644 (file)
@@ -1899,7 +1899,7 @@ static tree cp_parser_string_literal
 static tree cp_parser_userdef_char_literal
   (cp_parser *);
 static tree cp_parser_userdef_string_literal
-  (cp_token *);
+  (tree);
 static tree cp_parser_userdef_numeric_literal
   (cp_parser *);
 
@@ -3721,8 +3721,7 @@ cp_parser_string_literal (cp_parser *parser, bool translate, bool wide_ok)
        {
          tree literal = build_userdef_literal (suffix_id, value,
                                                OT_NONE, NULL_TREE);
-         tok->u.value = literal;
-         return cp_parser_userdef_string_literal (tok);
+         value = cp_parser_userdef_string_literal (literal);
        }
     }
   else
@@ -3970,9 +3969,8 @@ cp_parser_userdef_numeric_literal (cp_parser *parser)
    as arguments.  */
 
 static tree
-cp_parser_userdef_string_literal (cp_token *token)
+cp_parser_userdef_string_literal (tree literal)
 {
-  tree literal = token->u.value;
   tree suffix_id = USERDEF_LITERAL_SUFFIX_ID (literal);
   tree name = cp_literal_operator_id (IDENTIFIER_POINTER (suffix_id));
   tree value = USERDEF_LITERAL_VALUE (literal);
@@ -23224,10 +23222,17 @@ cp_parser_template_declaration_after_export (cp_parser* parser, bool member_p)
            ok = false;
        }
       if (!ok)
-       error ("literal operator template %qD has invalid parameter list."
-              "  Expected non-type template argument pack <char...>"
-              " or <typename CharT, CharT...>",
-              decl);
+       {
+         if (cxx_dialect >= cxx1y)
+           error ("literal operator template %qD has invalid parameter list."
+                  "  Expected non-type template argument pack <char...>"
+                  " or <typename CharT, CharT...>",
+                  decl);
+         else
+           error ("literal operator template %qD has invalid parameter list."
+                  "  Expected non-type template argument pack <char...>",
+                  decl);
+       }
     }
   /* Register member declarations.  */
   if (member_p && !friend_p && decl && !DECL_CLASS_TEMPLATE_P (decl))
index bf35498a3aaa978717d3a7bdce723dd66521e88b..6c819425f6e64bd13597ceca140be774f3b2c0ce 100644 (file)
@@ -1,3 +1,12 @@
+2014-06-30  Edward Smith-Rowland  <3dw4rd@verizon.net>
+
+       PR c++/58781
+       PR c++/60249
+       PR c++/59867
+       * testsuite/g++.dg/cpp0x/pr58781.C: New.
+       * testsuite/g++.dg/cpp0x/pr60249.C: New.
+       * testsuite/g++.dg/cpp1y/pr59867.C: New.
+
 2014-06-30  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
 
        * gfortran.dg/round_4.f90: Skip for powerpc*-*-linux* since the
diff --git a/gcc/testsuite/g++.dg/cpp0x/pr58781.C b/gcc/testsuite/g++.dg/cpp0x/pr58781.C
new file mode 100644 (file)
index 0000000..58c972f
--- /dev/null
@@ -0,0 +1,18 @@
+// PR c++/58781
+// { dg-do compile { target c++11 } }
+
+#include <cstddef>
+
+int
+operator""_s(const char32_t *a, size_t b)
+{
+  return 0;
+}
+
+int
+f()
+{
+  using a = decltype(U"\x1181"_s);
+  using b = decltype(U"\x8111"_s);
+  using c = decltype(U" \x1181"_s);
+}
diff --git a/gcc/testsuite/g++.dg/cpp0x/pr60249.C b/gcc/testsuite/g++.dg/cpp0x/pr60249.C
new file mode 100644 (file)
index 0000000..e650dcb
--- /dev/null
@@ -0,0 +1,6 @@
+// PR c++/60249
+// { dg-do compile { target c++11 } }
+
+decltype(""_) x; // { dg-error "unable to find string literal operator" }
+
+// { dg-error "invalid type in declaration before" "invalid" { target *-*-* } 4 }
diff --git a/gcc/testsuite/g++.dg/cpp1y/pr59867.C b/gcc/testsuite/g++.dg/cpp1y/pr59867.C
new file mode 100644 (file)
index 0000000..0f27a20
--- /dev/null
@@ -0,0 +1,52 @@
+// PR c++/59867
+// { dg-do compile { target c++14 } }
+
+#include <iostream>
+using namespace std;
+
+// constant
+template<typename T, T x>
+  struct meta_value
+  {
+    typedef meta_value type;
+    typedef T value_type;
+    static const T value = x;
+  };
+
+// array
+template<typename T, T... data>
+  struct meta_array
+  {
+    typedef meta_array type;
+    typedef T item_type;
+  };
+
+// static array -> runtime array conversion utility
+template<typename T>
+  struct array_gen;
+
+template<typename T, T... xs>
+  struct array_gen<meta_array<T, xs...>>
+  {
+    static const T value[sizeof...(xs)];
+  };
+
+template<typename T, T... xs>
+  const T
+  array_gen<meta_array<T, xs...>>::value[sizeof...(xs)] = {xs...};
+
+// static string
+template<typename T, T... xs>
+  constexpr meta_array<T, xs...>
+  operator""_s()
+  {
+    static_assert(sizeof...(xs) == 3, "What's wrong with you?");
+    return meta_array<T, xs...>();
+  }
+
+int
+main()
+{
+  auto a = "123"_s;
+  const char (& xs)[3] = array_gen<decltype("123"_s)>::value;
+}