On Fri, 14 Sep 2012, Jason Merrill wrote:

On 09/14/2012 11:03 AM, Marc Glisse wrote:
I wanted to use decltype(x<x) to find an integer vector type of the same
size as x, and then actually be able to use it. Being opaque, it refuses
to be initialized (cp/decl.c:5550). Maybe decltype (and others?) could
return non-opaque types?

That sounds like the right answer.

Hello,

does the attached make sense? It passes booststrap+testsuite, but with vectors that doesn't prove much...


2012-09-17  Marc Glisse  <marc.gli...@inria.fr>

        PR c++/54581

gcc/cp/
        * semantics.c (finish_decltype_type): Make vectors not opaque.

gcc/testsuite/
        * g++.dg/cpp0x/decltype-54581.C: New testcase.

--
Marc Glisse
Index: cp/semantics.c
===================================================================
--- cp/semantics.c      (revision 191341)
+++ cp/semantics.c      (working copy)
@@ -5305,20 +5305,25 @@ finish_decltype_type (tree expr, bool id
        /* If the expression is just "this", we want the
           cv-unqualified pointer for the "this" type.  */
        type = TYPE_MAIN_VARIANT (TREE_TYPE (expr));
       else
        {
          /* Otherwise, where T is the type of e, if e is an lvalue,
             decltype(e) is defined as T&; if an xvalue, T&&; otherwise, T. */
          cp_lvalue_kind clk = lvalue_kind (expr);
          type = unlowered_expr_type (expr);
          gcc_assert (TREE_CODE (type) != REFERENCE_TYPE);
+
+         /* For vector types, pick a non-opaque variant.  */
+         if (TREE_CODE (type) == VECTOR_TYPE)
+           type = cp_build_qualified_type (TYPE_MAIN_VARIANT (type),
+                                           cp_type_quals (type));
          if (clk != clk_none && !(clk & clk_class))
            type = cp_build_reference_type (type, (clk & clk_rvalueref));
        }
     }
 
   return type;
 }
 
 /* Called from trait_expr_value to evaluate either __has_nothrow_assign or 
    __has_nothrow_copy, depending on assign_p.  */
Index: testsuite/g++.dg/cpp0x/decltype-54581.C
===================================================================
--- testsuite/g++.dg/cpp0x/decltype-54581.C     (revision 0)
+++ testsuite/g++.dg/cpp0x/decltype-54581.C     (revision 0)
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+/* { dg-options "-std=gnu++11 -Wall" } */
+
+typedef float v4f __attribute__((vector_size(4*sizeof(float))));
+
+template <class T> void eat (T&&) {}
+
+void test1 ()
+{
+  v4f x = {0,1,2,3};
+  typedef decltype (x < x) v4i;
+  v4i y = {4,5,6,7}; // v4i is not opaque
+  eat (y);
+}
+
+template<class V>
+void test2 ()
+{
+  V x = {0,1,2,3};
+  typedef decltype (x < x) v4i;
+  v4i y = {4,5,6,7}; // v4i is not opaque
+  eat (y);
+}
+
+int main(){
+  test1();
+  test2<v4f>();
+}

Property changes on: testsuite/g++.dg/cpp0x/decltype-54581.C
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision URL

Reply via email to