]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
* typeck.c (check_literal_operator_args): Avoid building types.
authorJason Merrill <jason@redhat.com>
Wed, 26 Oct 2011 19:31:26 +0000 (15:31 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 26 Oct 2011 19:31:26 +0000 (15:31 -0400)
From-SVN: r180538

gcc/cp/ChangeLog
gcc/cp/typeck.c

index ee942cab6d6794911e02178729d39d12bee89def..3f4455eb6afb19b14fba8b647d344730f9c7d633 100644 (file)
@@ -1,3 +1,7 @@
+2011-10-26  Jason Merrill  <jason@redhat.com>
+
+       * typeck.c (check_literal_operator_args): Avoid building types.
+
 2011-10-26  Ed Smith-Rowland  <3dw4rd@verizon.net>
 
        Implement C++11 user-defined literals.
index 59e1357cb0bf272f70973ce33e1a0c5da91119c7..ec14934a8232ccd6b1e92ab2507566e201d438c5 100644 (file)
@@ -8405,12 +8405,6 @@ check_literal_operator_args (const_tree decl,
       bool found_string_p = false;
       bool maybe_raw_p = false;
       bool found_size_p = false;
-      tree const_wchar_ptr_type_node
-          = build_pointer_type (build_type_variant (wchar_type_node, 1, 0));
-      tree const_char16_ptr_type_node
-          = build_pointer_type (build_type_variant (char16_type_node, 1, 0));
-      tree const_char32_ptr_type_node
-          = build_pointer_type (build_type_variant (char32_type_node, 1, 0));
 
       *long_long_unsigned_p = false;
       *long_double_p = false;
@@ -8423,17 +8417,26 @@ check_literal_operator_args (const_tree decl,
          tree t = TREE_VALUE (argtype);
          ++arity;
 
-         if (same_type_p (t, const_string_type_node))
+         if (TREE_CODE (t) == POINTER_TYPE)
            {
-             found_string_p = true;
-             maybe_raw_p = true;
+             t = TREE_TYPE (t);
+             if (cp_type_quals (t) != TYPE_QUAL_CONST)
+               return false;
+             t = TYPE_MAIN_VARIANT (t);
+             if (same_type_p (t, char_type_node))
+               {
+                 found_string_p = true;
+                 maybe_raw_p = true;
+               }
+             else if (same_type_p (t, wchar_type_node))
+               found_string_p = true;
+             else if (same_type_p (t, char16_type_node))
+               found_string_p = true;
+             else if (same_type_p (t, char32_type_node))
+               found_string_p = true;
+             else
+               return false;
            }
-         else if (same_type_p (t, const_wchar_ptr_type_node))
-           found_string_p = true;
-         else if (same_type_p (t, const_char16_ptr_type_node))
-           found_string_p = true;
-         else if (same_type_p (t, const_char32_ptr_type_node))
-           found_string_p = true;
          else if (same_type_p (t, size_type_node))
            {
              if (!found_string_p)