/cp
2014-09-02  Paolo Carlini  <paolo.carlini@oracle.com>

	DR 1453
	* class.c (check_field_decls): A class of literal type cannot have
	volatile non-static data members and base classes.
	(explain_non_literal_class): Update.

/testsuite
2014-09-02  Paolo Carlini  <paolo.carlini@oracle.com>

	DR 1453
	* g++.dg/cpp0x/constexpr-volatile.C: New.
	* g++.dg/ext/is_literal_type2.C: Likewise.

From-SVN: r214823
This commit is contained in:
Paolo Carlini 2014-09-02 15:38:38 +00:00 committed by Paolo Carlini
parent 4e2b2eeec9
commit cec362c90b
5 changed files with 73 additions and 3 deletions

View File

@ -1,3 +1,10 @@
2014-09-02 Paolo Carlini <paolo.carlini@oracle.com>
DR 1453
* class.c (check_field_decls): A class of literal type cannot have
volatile non-static data members and base classes.
(explain_non_literal_class): Update.
2014-09-02 Jakub Jelinek <jakub@redhat.com>
Balaji V. Iyer <balaji.v.iyer@intel.com>
Igor Zamyatin <igor.zamyatin@intel.com>

View File

@ -3528,9 +3528,11 @@ check_field_decls (tree t, tree *access_decls,
CLASSTYPE_NON_AGGREGATE (t) = 1;
/* If at least one non-static data member is non-literal, the whole
class becomes non-literal. Note: if the type is incomplete we
will complain later on. */
if (COMPLETE_TYPE_P (type) && !literal_type_p (type))
class becomes non-literal. Per Core/1453, volatile non-static
data members and base classes are also not allowed.
Note: if the type is incomplete we will complain later on. */
if (COMPLETE_TYPE_P (type)
&& (!literal_type_p (type) || CP_TYPE_VOLATILE_P (type)))
CLASSTYPE_LITERAL_P (t) = false;
/* A standard-layout class is a class that:
@ -5431,6 +5433,9 @@ explain_non_literal_class (tree t)
if (CLASS_TYPE_P (ftype))
explain_non_literal_class (ftype);
}
if (CP_TYPE_VOLATILE_P (ftype))
inform (0, " non-static data member %q+D has "
"volatile type", field);
}
}
}

View File

@ -1,3 +1,9 @@
2014-09-02 Paolo Carlini <paolo.carlini@oracle.com>
DR 1453
* g++.dg/cpp0x/constexpr-volatile.C: New.
* g++.dg/ext/is_literal_type2.C: Likewise.
2014-09-02 Jakub Jelinek <jakub@redhat.com>
Balaji V. Iyer <balaji.v.iyer@intel.com>
Igor Zamyatin <igor.zamyatin@intel.com>

View File

@ -0,0 +1,26 @@
// DR 1453
// { dg-do compile { target c++11 } }
struct S {
constexpr S() : n{} { }
volatile int n;
};
constexpr S s; // { dg-error "literal" }
struct Z {
volatile int m;
};
struct T {
constexpr T() : n{} { }
Z n;
};
constexpr T t; // { dg-error "literal" }
struct U : Z {
constexpr U() : Z{} { }
};
constexpr U u; // { dg-error "literal" }

View File

@ -0,0 +1,26 @@
// DR 1453
// { dg-do compile { target c++11 } }
struct S {
constexpr S() : n{} { }
volatile int n;
};
static_assert(!__is_literal_type(S), "");
struct Z {
volatile int m;
};
struct T {
constexpr T() : n{} { }
Z n;
};
static_assert(!__is_literal_type(T), "");
struct U : Z {
constexpr U() : Z{} { }
};
static_assert(!__is_literal_type(U), "");