@@ -3802,6 +3802,9 @@ diagnose_trait_expr (tree expr, tree args)
case CPTK_IS_SAME:
inform (loc, " %qT is not the same as %qT", t1, t2);
break;
+ case CPTK_IS_SCALAR:
+ inform (loc, " %qT is not a scalar type", t1);
+ break;
case CPTK_IS_SIGNED:
inform (loc, " %qT is not a signed type", t1);
break;
@@ -86,6 +86,7 @@ DEFTRAIT_EXPR (IS_POINTER, "__is_pointer", 1)
DEFTRAIT_EXPR (IS_POLYMORPHIC, "__is_polymorphic", 1)
DEFTRAIT_EXPR (IS_REFERENCE, "__is_reference", 1)
DEFTRAIT_EXPR (IS_SAME, "__is_same", 2)
+DEFTRAIT_EXPR (IS_SCALAR, "__is_scalar", 1)
DEFTRAIT_EXPR (IS_SIGNED, "__is_signed", 1)
DEFTRAIT_EXPR (IS_SCOPED_ENUM, "__is_scoped_enum", 1)
DEFTRAIT_EXPR (IS_STD_LAYOUT, "__is_standard_layout", 1)
@@ -66,6 +66,7 @@ struct cp_trait {
"__is_polymorphic", CPTK_IS_POLYMORPHIC, 1, false
"__is_reference", CPTK_IS_REFERENCE, 1, false
"__is_same", CPTK_IS_SAME, 2, false
+"__is_scalar", CPTK_IS_SCALAR, 1, false
"__is_signed", CPTK_IS_SIGNED, 1, false
"__is_scoped_enum", CPTK_IS_SCOPED_ENUM, 1, false
"__is_standard_layout", CPTK_IS_STD_LAYOUT, 1, false
@@ -78,10 +78,10 @@ cp_trait_lookup::hash (const char *str, size_t len)
126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
- 126, 126, 126, 126, 126, 20, 126, 40, 45, 50,
- 55, 0, 5, 15, 126, 0, 126, 126, 35, 10,
- 35, 0, 10, 126, 30, 5, 5, 16, 30, 126,
- 126, 10, 126, 126, 126, 126, 126, 126, 126, 126,
+ 126, 126, 126, 126, 126, 40, 126, 25, 21, 50,
+ 0, 0, 30, 10, 126, 0, 126, 126, 25, 5,
+ 50, 0, 61, 126, 10, 10, 5, 0, 15, 126,
+ 126, 5, 126, 126, 126, 126, 126, 126, 126, 126,
126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
@@ -116,7 +116,7 @@ cp_trait_lookup::find (const char *str, size_t len)
{
enum
{
- TOTAL_KEYWORDS = 61,
+ TOTAL_KEYWORDS = 62,
MIN_WORD_LENGTH = 7,
MAX_WORD_LENGTH = 37,
MIN_HASH_VALUE = 7,
@@ -125,141 +125,143 @@ cp_trait_lookup::find (const char *str, size_t len)
static const struct cp_trait wordlist[] =
{
-#line 89 "../../gcc/cp/cp-trait.gperf"
+#line 90 "../../gcc/cp/cp-trait.gperf"
{"__bases", CPTK_BASES, 1, true},
-#line 82 "../../gcc/cp/cp-trait.gperf"
- {"__remove_cv", CPTK_REMOVE_CV, 1, true},
+#line 52 "../../gcc/cp/cp-trait.gperf"
+ {"__is_enum", CPTK_IS_ENUM, 1, false},
+#line 78 "../../gcc/cp/cp-trait.gperf"
+ {"__is_union", CPTK_IS_UNION, 1, false},
#line 83 "../../gcc/cp/cp-trait.gperf"
- {"__remove_cvref", CPTK_REMOVE_CVREF, 1, true},
+ {"__remove_cv", CPTK_REMOVE_CV, 1, true},
#line 84 "../../gcc/cp/cp-trait.gperf"
+ {"__remove_cvref", CPTK_REMOVE_CVREF, 1, true},
+#line 89 "../../gcc/cp/cp-trait.gperf"
+ {"__is_deducible ", CPTK_IS_DEDUCIBLE, 2, false},
+#line 85 "../../gcc/cp/cp-trait.gperf"
{"__remove_pointer", CPTK_REMOVE_POINTER, 1, true},
-#line 72 "../../gcc/cp/cp-trait.gperf"
+#line 73 "../../gcc/cp/cp-trait.gperf"
{"__is_trivial", CPTK_IS_TRIVIAL, 1, false},
-#line 85 "../../gcc/cp/cp-trait.gperf"
+#line 86 "../../gcc/cp/cp-trait.gperf"
{"__remove_reference", CPTK_REMOVE_REFERENCE, 1, true},
-#line 90 "../../gcc/cp/cp-trait.gperf"
+#line 91 "../../gcc/cp/cp-trait.gperf"
{"__direct_bases", CPTK_DIRECT_BASES, 1, true},
-#line 51 "../../gcc/cp/cp-trait.gperf"
- {"__is_empty", CPTK_IS_EMPTY, 1, false},
-#line 70 "../../gcc/cp/cp-trait.gperf"
- {"__is_scoped_enum", CPTK_IS_SCOPED_ENUM, 1, false},
-#line 65 "../../gcc/cp/cp-trait.gperf"
- {"__is_pointer", CPTK_IS_POINTER, 1, false},
+#line 79 "../../gcc/cp/cp-trait.gperf"
+ {"__is_unsigned", CPTK_IS_UNSIGNED, 1, false},
#line 68 "../../gcc/cp/cp-trait.gperf"
{"__is_same", CPTK_IS_SAME, 2, false},
-#line 52 "../../gcc/cp/cp-trait.gperf"
- {"__is_enum", CPTK_IS_ENUM, 1, false},
-#line 77 "../../gcc/cp/cp-trait.gperf"
- {"__is_union", CPTK_IS_UNION, 1, false},
+#line 71 "../../gcc/cp/cp-trait.gperf"
+ {"__is_scoped_enum", CPTK_IS_SCOPED_ENUM, 1, false},
#line 30 "../../gcc/cp/cp-trait.gperf"
{"__is_same_as", CPTK_IS_SAME, 2, false},
-#line 75 "../../gcc/cp/cp-trait.gperf"
+#line 76 "../../gcc/cp/cp-trait.gperf"
{"__is_trivially_copyable", CPTK_IS_TRIVIALLY_COPYABLE, 1, false},
-#line 86 "../../gcc/cp/cp-trait.gperf"
- {"__type_pack_element", CPTK_TYPE_PACK_ELEMENT, -1, true},
-#line 73 "../../gcc/cp/cp-trait.gperf"
+#line 59 "../../gcc/cp/cp-trait.gperf"
+ {"__is_member_pointer", CPTK_IS_MEMBER_POINTER, 1, false},
+#line 74 "../../gcc/cp/cp-trait.gperf"
{"__is_trivially_assignable", CPTK_IS_TRIVIALLY_ASSIGNABLE, 2, false},
-#line 69 "../../gcc/cp/cp-trait.gperf"
+#line 70 "../../gcc/cp/cp-trait.gperf"
{"__is_signed", CPTK_IS_SIGNED, 1, false},
-#line 74 "../../gcc/cp/cp-trait.gperf"
+#line 75 "../../gcc/cp/cp-trait.gperf"
{"__is_trivially_constructible", CPTK_IS_TRIVIALLY_CONSTRUCTIBLE, -1, false},
-#line 78 "../../gcc/cp/cp-trait.gperf"
- {"__is_unsigned", CPTK_IS_UNSIGNED, 1, false},
-#line 81 "../../gcc/cp/cp-trait.gperf"
+#line 82 "../../gcc/cp/cp-trait.gperf"
{"__reference_converts_from_temporary", CPTK_REF_CONVERTS_FROM_TEMPORARY, 2, false},
-#line 80 "../../gcc/cp/cp-trait.gperf"
- {"__reference_constructs_from_temporary", CPTK_REF_CONSTRUCTS_FROM_TEMPORARY, 2, false},
-#line 33 "../../gcc/cp/cp-trait.gperf"
- {"__has_nothrow_copy", CPTK_HAS_NOTHROW_COPY, 1, false},
-#line 59 "../../gcc/cp/cp-trait.gperf"
- {"__is_member_pointer", CPTK_IS_MEMBER_POINTER, 1, false},
-#line 31 "../../gcc/cp/cp-trait.gperf"
- {"__has_nothrow_assign", CPTK_HAS_NOTHROW_ASSIGN, 1, false},
-#line 39 "../../gcc/cp/cp-trait.gperf"
- {"__has_virtual_destructor", CPTK_HAS_VIRTUAL_DESTRUCTOR, 1, false},
-#line 32 "../../gcc/cp/cp-trait.gperf"
- {"__has_nothrow_constructor", CPTK_HAS_NOTHROW_CONSTRUCTOR, 1, false},
#line 58 "../../gcc/cp/cp-trait.gperf"
{"__is_member_object_pointer", CPTK_IS_MEMBER_OBJECT_POINTER, 1, false},
-#line 63 "../../gcc/cp/cp-trait.gperf"
- {"__is_pointer_interconvertible_base_of", CPTK_IS_POINTER_INTERCONVERTIBLE_BASE_OF, 2, false},
+#line 81 "../../gcc/cp/cp-trait.gperf"
+ {"__reference_constructs_from_temporary", CPTK_REF_CONSTRUCTS_FROM_TEMPORARY, 2, false},
#line 57 "../../gcc/cp/cp-trait.gperf"
{"__is_member_function_pointer", CPTK_IS_MEMBER_FUNCTION_POINTER, 1, false},
-#line 67 "../../gcc/cp/cp-trait.gperf"
- {"__is_reference", CPTK_IS_REFERENCE, 1, false},
-#line 53 "../../gcc/cp/cp-trait.gperf"
- {"__is_final", CPTK_IS_FINAL, 1, false},
-#line 87 "../../gcc/cp/cp-trait.gperf"
- {"__underlying_type", CPTK_UNDERLYING_TYPE, 1, true},
-#line 54 "../../gcc/cp/cp-trait.gperf"
- {"__is_function", CPTK_IS_FUNCTION, 1, false},
+#line 46 "../../gcc/cp/cp-trait.gperf"
+ {"__is_bounded_array", CPTK_IS_BOUNDED_ARRAY, 1, false},
#line 42 "../../gcc/cp/cp-trait.gperf"
{"__is_arithmetic", CPTK_IS_ARITHMETIC, 1, false},
+#line 77 "../../gcc/cp/cp-trait.gperf"
+ {"__is_unbounded_array", CPTK_IS_UNBOUNDED_ARRAY, 1, false},
+#line 88 "../../gcc/cp/cp-trait.gperf"
+ {"__underlying_type", CPTK_UNDERLYING_TYPE, 1, true},
+#line 45 "../../gcc/cp/cp-trait.gperf"
+ {"__is_base_of", CPTK_IS_BASE_OF, 2, false},
+#line 43 "../../gcc/cp/cp-trait.gperf"
+ {"__is_array", CPTK_IS_ARRAY, 1, false},
+#line 69 "../../gcc/cp/cp-trait.gperf"
+ {"__is_scalar", CPTK_IS_SCALAR, 1, false},
#line 56 "../../gcc/cp/cp-trait.gperf"
{"__is_literal_type", CPTK_IS_LITERAL_TYPE, 1, false},
#line 40 "../../gcc/cp/cp-trait.gperf"
{"__is_abstract", CPTK_IS_ABSTRACT, 1, false},
+#line 41 "../../gcc/cp/cp-trait.gperf"
+ {"__is_aggregate", CPTK_IS_AGGREGATE, 1, false},
#line 44 "../../gcc/cp/cp-trait.gperf"
{"__is_assignable", CPTK_IS_ASSIGNABLE, 2, false},
-#line 66 "../../gcc/cp/cp-trait.gperf"
- {"__is_polymorphic", CPTK_IS_POLYMORPHIC, 1, false},
-#line 45 "../../gcc/cp/cp-trait.gperf"
- {"__is_base_of", CPTK_IS_BASE_OF, 2, false},
-#line 60 "../../gcc/cp/cp-trait.gperf"
- {"__is_nothrow_assignable", CPTK_IS_NOTHROW_ASSIGNABLE, 2, false},
-#line 62 "../../gcc/cp/cp-trait.gperf"
- {"__is_nothrow_convertible", CPTK_IS_NOTHROW_CONVERTIBLE, 2, false},
-#line 71 "../../gcc/cp/cp-trait.gperf"
- {"__is_standard_layout", CPTK_IS_STD_LAYOUT, 1, false},
-#line 61 "../../gcc/cp/cp-trait.gperf"
- {"__is_nothrow_constructible", CPTK_IS_NOTHROW_CONSTRUCTIBLE, -1, false},
#line 55 "../../gcc/cp/cp-trait.gperf"
{"__is_layout_compatible", CPTK_IS_LAYOUT_COMPATIBLE, 2, false},
+#line 80 "../../gcc/cp/cp-trait.gperf"
+ {"__is_volatile", CPTK_IS_VOLATILE, 1, false},
+#line 67 "../../gcc/cp/cp-trait.gperf"
+ {"__is_reference", CPTK_IS_REFERENCE, 1, false},
+#line 72 "../../gcc/cp/cp-trait.gperf"
+ {"__is_standard_layout", CPTK_IS_STD_LAYOUT, 1, false},
+#line 33 "../../gcc/cp/cp-trait.gperf"
+ {"__has_nothrow_copy", CPTK_HAS_NOTHROW_COPY, 1, false},
+#line 31 "../../gcc/cp/cp-trait.gperf"
+ {"__has_nothrow_assign", CPTK_HAS_NOTHROW_ASSIGN, 1, false},
+#line 39 "../../gcc/cp/cp-trait.gperf"
+ {"__has_virtual_destructor", CPTK_HAS_VIRTUAL_DESTRUCTOR, 1, false},
+#line 32 "../../gcc/cp/cp-trait.gperf"
+ {"__has_nothrow_constructor", CPTK_HAS_NOTHROW_CONSTRUCTOR, 1, false},
#line 36 "../../gcc/cp/cp-trait.gperf"
{"__has_trivial_copy", CPTK_HAS_TRIVIAL_COPY, 1, false},
-#line 41 "../../gcc/cp/cp-trait.gperf"
- {"__is_aggregate", CPTK_IS_AGGREGATE, 1, false},
-#line 34 "../../gcc/cp/cp-trait.gperf"
- {"__has_trivial_assign", CPTK_HAS_TRIVIAL_ASSIGN, 1, false},
#line 64 "../../gcc/cp/cp-trait.gperf"
{"__is_pod", CPTK_IS_POD, 1, false},
+#line 34 "../../gcc/cp/cp-trait.gperf"
+ {"__has_trivial_assign", CPTK_HAS_TRIVIAL_ASSIGN, 1, false},
+#line 51 "../../gcc/cp/cp-trait.gperf"
+ {"__is_empty", CPTK_IS_EMPTY, 1, false},
+#line 65 "../../gcc/cp/cp-trait.gperf"
+ {"__is_pointer", CPTK_IS_POINTER, 1, false},
#line 37 "../../gcc/cp/cp-trait.gperf"
{"__has_trivial_destructor", CPTK_HAS_TRIVIAL_DESTRUCTOR, 1, false},
#line 35 "../../gcc/cp/cp-trait.gperf"
{"__has_trivial_constructor", CPTK_HAS_TRIVIAL_CONSTRUCTOR, 1, false},
-#line 79 "../../gcc/cp/cp-trait.gperf"
- {"__is_volatile", CPTK_IS_VOLATILE, 1, false},
-#line 46 "../../gcc/cp/cp-trait.gperf"
- {"__is_bounded_array", CPTK_IS_BOUNDED_ARRAY, 1, false},
-#line 43 "../../gcc/cp/cp-trait.gperf"
- {"__is_array", CPTK_IS_ARRAY, 1, false},
-#line 76 "../../gcc/cp/cp-trait.gperf"
- {"__is_unbounded_array", CPTK_IS_UNBOUNDED_ARRAY, 1, false},
-#line 38 "../../gcc/cp/cp-trait.gperf"
- {"__has_unique_object_representations", CPTK_HAS_UNIQUE_OBJ_REPRESENTATIONS, 1, false},
-#line 48 "../../gcc/cp/cp-trait.gperf"
- {"__is_const", CPTK_IS_CONST, 1, false},
+#line 60 "../../gcc/cp/cp-trait.gperf"
+ {"__is_nothrow_assignable", CPTK_IS_NOTHROW_ASSIGNABLE, 2, false},
+#line 62 "../../gcc/cp/cp-trait.gperf"
+ {"__is_nothrow_convertible", CPTK_IS_NOTHROW_CONVERTIBLE, 2, false},
+#line 87 "../../gcc/cp/cp-trait.gperf"
+ {"__type_pack_element", CPTK_TYPE_PACK_ELEMENT, -1, true},
+#line 61 "../../gcc/cp/cp-trait.gperf"
+ {"__is_nothrow_constructible", CPTK_IS_NOTHROW_CONSTRUCTIBLE, -1, false},
#line 47 "../../gcc/cp/cp-trait.gperf"
{"__is_class", CPTK_IS_CLASS, 1, false},
+#line 53 "../../gcc/cp/cp-trait.gperf"
+ {"__is_final", CPTK_IS_FINAL, 1, false},
+#line 54 "../../gcc/cp/cp-trait.gperf"
+ {"__is_function", CPTK_IS_FUNCTION, 1, false},
+#line 63 "../../gcc/cp/cp-trait.gperf"
+ {"__is_pointer_interconvertible_base_of", CPTK_IS_POINTER_INTERCONVERTIBLE_BASE_OF, 2, false},
+#line 66 "../../gcc/cp/cp-trait.gperf"
+ {"__is_polymorphic", CPTK_IS_POLYMORPHIC, 1, false},
+#line 48 "../../gcc/cp/cp-trait.gperf"
+ {"__is_const", CPTK_IS_CONST, 1, false},
#line 50 "../../gcc/cp/cp-trait.gperf"
{"__is_convertible", CPTK_IS_CONVERTIBLE, 2, false},
#line 49 "../../gcc/cp/cp-trait.gperf"
{"__is_constructible", CPTK_IS_CONSTRUCTIBLE, -1, false},
-#line 88 "../../gcc/cp/cp-trait.gperf"
- {"__is_deducible ", CPTK_IS_DEDUCIBLE, 2, false}
+#line 38 "../../gcc/cp/cp-trait.gperf"
+ {"__has_unique_object_representations", CPTK_HAS_UNIQUE_OBJ_REPRESENTATIONS, 1, false}
};
static const signed char lookup[] =
{
- -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, 1, -1, -1,
- 2, -1, 3, 4, 5, 6, 7, 8, 9, -1, 10, 11, 12, 13,
- 14, 15, 16, 17, -1, 18, 19, 20, -1, 21, 22, 23, 24, -1,
- -1, -1, 25, 26, 27, 28, 29, 30, 31, -1, 32, 33, -1, 34,
- -1, 35, 36, -1, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46,
- 47, -1, -1, 48, 49, 50, -1, -1, 51, 52, 53, 54, -1, -1,
- -1, -1, -1, -1, -1, -1, 55, -1, -1, -1, -1, 56, -1, -1,
- -1, -1, 57, 58, -1, 59, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 60
+ -1, -1, -1, -1, -1, -1, -1, 0, -1, 1, 2, 3, -1, -1,
+ 4, 5, 6, 7, 8, 9, -1, -1, -1, 10, 11, -1, 12, 13,
+ 14, 15, 16, 17, -1, 18, -1, 19, 20, 21, 22, 23, 24, 25,
+ 26, 27, -1, 28, 29, 30, 31, 32, 33, -1, 34, 35, 36, 37,
+ -1, -1, 38, -1, 39, -1, -1, -1, 40, 41, -1, -1, 42, 43,
+ 44, 45, -1, 46, 47, 48, -1, -1, 49, 50, 51, 52, -1, -1,
+ -1, 53, -1, -1, -1, -1, 54, -1, -1, 55, -1, -1, -1, -1,
+ 56, -1, -1, -1, 57, -1, -1, -1, -1, -1, -1, -1, 58, -1,
+ -1, -1, -1, -1, 59, -1, 60, -1, -1, -1, -1, -1, -1, 61
};
if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
@@ -12226,6 +12226,9 @@ trait_expr_value (cp_trait_kind kind, tree type1, tree type2)
case CPTK_IS_SAME:
return same_type_p (type1, type2);
+ case CPTK_IS_SCALAR:
+ return SCALAR_TYPE_P (type1);
+
case CPTK_IS_SIGNED:
return ARITHMETIC_TYPE_P (type1) && TYPE_SIGN (type1) == SIGNED;
@@ -12428,6 +12431,7 @@ finish_trait_expr (location_t loc, cp_trait_kind kind, tree type1, tree type2)
case CPTK_IS_POINTER:
case CPTK_IS_REFERENCE:
case CPTK_IS_SAME:
+ case CPTK_IS_SCALAR:
case CPTK_IS_SIGNED:
case CPTK_IS_SCOPED_ENUM:
case CPTK_IS_UNBOUNDED_ARRAY:
@@ -140,6 +140,9 @@
#if !__has_builtin (__is_same_as)
# error "__has_builtin (__is_same_as) failed"
#endif
+#if !__has_builtin (__is_scalar)
+# error "__has_builtin (__is_scalar) failed"
+#endif
#if !__has_builtin (__is_signed)
# error "__has_builtin (__is_signed) failed"
#endif
new file mode 100644
@@ -0,0 +1,31 @@
+// { dg-do compile { target c++11 } }
+
+#include <cstddef> // std::nullptr_t
+#include <testsuite_tr1.h>
+
+using namespace __gnu_test;
+
+#define SA(X) static_assert((X),#X)
+
+#define SA_TEST_CATEGORY(TRAIT, TYPE, EXPECT) \
+ SA(TRAIT(TYPE) == EXPECT); \
+ SA(TRAIT(const TYPE) == EXPECT); \
+ SA(TRAIT(volatile TYPE) == EXPECT); \
+ SA(TRAIT(const volatile TYPE) == EXPECT)
+
+// volatile return type would cause a warning.
+#define SA_FN_TEST_CATEGORY(TRAIT, TYPE, EXPECT) \
+ SA(TRAIT(TYPE) == EXPECT); \
+ SA(TRAIT(const TYPE) == EXPECT)
+
+SA_TEST_CATEGORY(__is_scalar, int, true);
+SA_TEST_CATEGORY(__is_scalar, float, true);
+SA_TEST_CATEGORY(__is_scalar, EnumType, true);
+SA_TEST_CATEGORY(__is_scalar, int*, true);
+SA_FN_TEST_CATEGORY(__is_scalar, int(*)(int), true);
+SA_TEST_CATEGORY(__is_scalar, int (ClassType::*), true);
+SA_FN_TEST_CATEGORY(__is_scalar, int (ClassType::*) (int), true);
+SA_TEST_CATEGORY(__is_scalar, std::nullptr_t, true);
+
+// Sanity check.
+SA_TEST_CATEGORY(__is_scalar, ClassType, false);