tree lambda_proxy_type (tree ref) { tree type; if (ref == error_mark_node) return error_mark_node; if (REFERENCE_REF_P (ref)) ref = TREE_OPERAND (ref, 0); gcc_assert (TREE_CODE (ref) == COMPONENT_REF); type = TREE_TYPE (ref); if (!type || WILDCARD_TYPE_P (non_reference (type))) { type = cxx_make_type (DECLTYPE_TYPE); DECLTYPE_TYPE_EXPR (type) = ref; DECLTYPE_FOR_LAMBDA_PROXY (type) = true; SET_TYPE_STRUCTURAL_EQUALITY (type); } if (DECL_PACK_P (TREE_OPERAND (ref, 1))) type = make_pack_expansion (type); return type; }
tree lambda_capture_field_type (tree expr, bool explicit_init_p) { tree type; if (explicit_init_p) { type = make_auto (); type = do_auto_deduction (type, expr, type); } else type = non_reference (unlowered_expr_type (expr)); if (type_dependent_expression_p (expr) && !is_this_parameter (tree_strip_nop_conversions (expr))) { type = cxx_make_type (DECLTYPE_TYPE); DECLTYPE_TYPE_EXPR (type) = expr; DECLTYPE_FOR_LAMBDA_CAPTURE (type) = true; DECLTYPE_FOR_INIT_CAPTURE (type) = explicit_init_p; SET_TYPE_STRUCTURAL_EQUALITY (type); } return type; }
tree lambda_capture_field_type (tree expr, bool explicit_init_p) { tree type; if (explicit_init_p) { type = make_auto (); type = do_auto_deduction (type, expr, type); } else type = non_reference (unlowered_expr_type (expr)); if (!type || WILDCARD_TYPE_P (type) || type_uses_auto (type) || DECL_PACK_P (expr)) { type = cxx_make_type (DECLTYPE_TYPE); DECLTYPE_TYPE_EXPR (type) = expr; DECLTYPE_FOR_LAMBDA_CAPTURE (type) = true; DECLTYPE_FOR_INIT_CAPTURE (type) = explicit_init_p; SET_TYPE_STRUCTURAL_EQUALITY (type); } return type; }
static void aarch64_init_simd_builtin_types (void) { int i; int nelts = sizeof (aarch64_simd_types) / sizeof (aarch64_simd_types[0]); tree tdecl; /* Init all the element types built by the front-end. */ aarch64_simd_types[Int8x8_t].eltype = intQI_type_node; aarch64_simd_types[Int8x16_t].eltype = intQI_type_node; aarch64_simd_types[Int16x4_t].eltype = intHI_type_node; aarch64_simd_types[Int16x8_t].eltype = intHI_type_node; aarch64_simd_types[Int32x2_t].eltype = intSI_type_node; aarch64_simd_types[Int32x4_t].eltype = intSI_type_node; aarch64_simd_types[Int64x1_t].eltype = intDI_type_node; aarch64_simd_types[Int64x2_t].eltype = intDI_type_node; aarch64_simd_types[Uint8x8_t].eltype = unsigned_intQI_type_node; aarch64_simd_types[Uint8x16_t].eltype = unsigned_intQI_type_node; aarch64_simd_types[Uint16x4_t].eltype = unsigned_intHI_type_node; aarch64_simd_types[Uint16x8_t].eltype = unsigned_intHI_type_node; aarch64_simd_types[Uint32x2_t].eltype = unsigned_intSI_type_node; aarch64_simd_types[Uint32x4_t].eltype = unsigned_intSI_type_node; aarch64_simd_types[Uint64x1_t].eltype = unsigned_intDI_type_node; aarch64_simd_types[Uint64x2_t].eltype = unsigned_intDI_type_node; /* Poly types are a world of their own. */ aarch64_simd_types[Poly8_t].eltype = aarch64_simd_types[Poly8_t].itype = build_distinct_type_copy (unsigned_intQI_type_node); aarch64_simd_types[Poly16_t].eltype = aarch64_simd_types[Poly16_t].itype = build_distinct_type_copy (unsigned_intHI_type_node); aarch64_simd_types[Poly64_t].eltype = aarch64_simd_types[Poly64_t].itype = build_distinct_type_copy (unsigned_intDI_type_node); aarch64_simd_types[Poly128_t].eltype = aarch64_simd_types[Poly128_t].itype = build_distinct_type_copy (unsigned_intTI_type_node); /* Init poly vector element types with scalar poly types. */ aarch64_simd_types[Poly8x8_t].eltype = aarch64_simd_types[Poly8_t].itype; aarch64_simd_types[Poly8x16_t].eltype = aarch64_simd_types[Poly8_t].itype; aarch64_simd_types[Poly16x4_t].eltype = aarch64_simd_types[Poly16_t].itype; aarch64_simd_types[Poly16x8_t].eltype = aarch64_simd_types[Poly16_t].itype; aarch64_simd_types[Poly64x1_t].eltype = aarch64_simd_types[Poly64_t].itype; aarch64_simd_types[Poly64x2_t].eltype = aarch64_simd_types[Poly64_t].itype; /* Continue with standard types. */ aarch64_simd_types[Float32x2_t].eltype = float_type_node; aarch64_simd_types[Float32x4_t].eltype = float_type_node; aarch64_simd_types[Float64x1_t].eltype = double_type_node; aarch64_simd_types[Float64x2_t].eltype = double_type_node; for (i = 0; i < nelts; i++) { tree eltype = aarch64_simd_types[i].eltype; enum machine_mode mode = aarch64_simd_types[i].mode; if (aarch64_simd_types[i].itype == NULL) aarch64_simd_types[i].itype = build_distinct_type_copy (build_vector_type (eltype, GET_MODE_NUNITS (mode))); tdecl = add_builtin_type (aarch64_simd_types[i].name, aarch64_simd_types[i].itype); TYPE_NAME (aarch64_simd_types[i].itype) = tdecl; SET_TYPE_STRUCTURAL_EQUALITY (aarch64_simd_types[i].itype); } #define AARCH64_BUILD_SIGNED_TYPE(mode) \ make_signed_type (GET_MODE_PRECISION (mode)); aarch64_simd_intOI_type_node = AARCH64_BUILD_SIGNED_TYPE (OImode); aarch64_simd_intEI_type_node = AARCH64_BUILD_SIGNED_TYPE (EImode); aarch64_simd_intCI_type_node = AARCH64_BUILD_SIGNED_TYPE (CImode); aarch64_simd_intXI_type_node = AARCH64_BUILD_SIGNED_TYPE (XImode); #undef AARCH64_BUILD_SIGNED_TYPE tdecl = add_builtin_type ("__builtin_aarch64_simd_ei" , aarch64_simd_intEI_type_node); TYPE_NAME (aarch64_simd_intEI_type_node) = tdecl; tdecl = add_builtin_type ("__builtin_aarch64_simd_oi" , aarch64_simd_intOI_type_node); TYPE_NAME (aarch64_simd_intOI_type_node) = tdecl; tdecl = add_builtin_type ("__builtin_aarch64_simd_ci" , aarch64_simd_intCI_type_node); TYPE_NAME (aarch64_simd_intCI_type_node) = tdecl; tdecl = add_builtin_type ("__builtin_aarch64_simd_xi" , aarch64_simd_intXI_type_node); TYPE_NAME (aarch64_simd_intXI_type_node) = tdecl; }