C++ DR 613
C++ DR 613 * semantics.c (finish_non_static_data_member): Allow such references without an associated object in sizeof/decltype/alignof. From-SVN: r145375
This commit is contained in:
parent
8245239992
commit
51fc2d02c7
6 changed files with 34 additions and 11 deletions
|
@ -1,5 +1,9 @@
|
|||
2009-03-31 Jason Merrill <jason@redhat.com>
|
||||
|
||||
C++ DR 613
|
||||
* semantics.c (finish_non_static_data_member): Allow such references
|
||||
without an associated object in sizeof/decltype/alignof.
|
||||
|
||||
* ptree.c (cxx_print_decl): Pretty-print full name of
|
||||
function/template.
|
||||
(cxx_print_type): Pretty-print full name of class.
|
||||
|
|
|
@ -1422,6 +1422,16 @@ finish_non_static_data_member (tree decl, tree object, tree qualifying_scope)
|
|||
{
|
||||
gcc_assert (TREE_CODE (decl) == FIELD_DECL);
|
||||
|
||||
if (!object && skip_evaluation)
|
||||
{
|
||||
/* DR 613: Can use non-static data members without an associated
|
||||
object in sizeof/decltype/alignof. */
|
||||
tree scope = qualifying_scope;
|
||||
if (scope == NULL_TREE)
|
||||
scope = context_for_name_lookup (decl);
|
||||
object = maybe_dummy_object (scope, NULL);
|
||||
}
|
||||
|
||||
if (!object)
|
||||
{
|
||||
if (current_function_decl
|
||||
|
@ -1433,7 +1443,8 @@ finish_non_static_data_member (tree decl, tree object, tree qualifying_scope)
|
|||
|
||||
return error_mark_node;
|
||||
}
|
||||
TREE_USED (current_class_ptr) = 1;
|
||||
if (current_class_ptr)
|
||||
TREE_USED (current_class_ptr) = 1;
|
||||
if (processing_template_decl && !qualifying_scope)
|
||||
{
|
||||
tree type = TREE_TYPE (decl);
|
||||
|
@ -1443,7 +1454,9 @@ finish_non_static_data_member (tree decl, tree object, tree qualifying_scope)
|
|||
else
|
||||
{
|
||||
/* Set the cv qualifiers. */
|
||||
int quals = cp_type_quals (TREE_TYPE (current_class_ref));
|
||||
int quals = (current_class_ref
|
||||
? cp_type_quals (TREE_TYPE (current_class_ref))
|
||||
: TYPE_UNQUALIFIED);
|
||||
|
||||
if (DECL_MUTABLE_P (decl))
|
||||
quals &= ~TYPE_QUAL_CONST;
|
||||
|
|
|
@ -26,6 +26,12 @@
|
|||
|
||||
2009-03-31 Jason Merrill <jason@redhat.com>
|
||||
|
||||
C++ DR 613
|
||||
* g++.old-deja/g++.dg/cpp0x/decltype3.C: Remove expected errors.
|
||||
* g++.old-deja/g++.ext/typeof2.C: Remove expected errors.
|
||||
* g++.old-deja/g++.other/sizeof2.C: Remove some expected errors,
|
||||
xfail others.
|
||||
|
||||
* g++.dg/other/typedef2.C: New test.
|
||||
|
||||
PR c++/37806
|
||||
|
|
|
@ -47,10 +47,10 @@ CHECK_DECLTYPE(decltype(caa.a), int);
|
|||
|
||||
class B {
|
||||
public:
|
||||
int a; // { dg-error "invalid use" }
|
||||
int a;
|
||||
enum B_enum { b };
|
||||
decltype(a) c; // { dg-error "from this location" }
|
||||
decltype(a) foo() { } // { dg-error "from this location" }
|
||||
decltype(a) c;
|
||||
decltype(a) foo() { }
|
||||
decltype(b) enums_are_in_scope() { return b; } // ok
|
||||
};
|
||||
|
||||
|
|
|
@ -3,6 +3,6 @@
|
|||
|
||||
struct S
|
||||
{
|
||||
int i; // { dg-error "" } non-static data member
|
||||
__typeof( S::i ) f (); // { dg-error "" } referenced here
|
||||
int i;
|
||||
__typeof( S::i ) f ();
|
||||
};
|
||||
|
|
|
@ -3,13 +3,13 @@
|
|||
|
||||
struct S
|
||||
{
|
||||
int j; // { dg-error "" } non-static data member
|
||||
int i[2]; // { dg-error "" } non-static data member
|
||||
int j;
|
||||
int i[2]; // { dg-error "" "" { xfail *-*-* } } non-static data member
|
||||
};
|
||||
|
||||
void f ()
|
||||
{
|
||||
sizeof (S::j); // { dg-error "" } used here
|
||||
sizeof (S::i[0]); // { dg-error "" } used here
|
||||
sizeof (S::j);
|
||||
sizeof (S::i[0]); // { dg-error "" "" { xfail *-*-* } } used here
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue