Commit 51fc2d02 by Jason Merrill Committed by Jason Merrill

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
parent 82452399
2009-03-31 Jason Merrill <jason@redhat.com> 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 * ptree.c (cxx_print_decl): Pretty-print full name of
function/template. function/template.
(cxx_print_type): Pretty-print full name of class. (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) ...@@ -1422,6 +1422,16 @@ finish_non_static_data_member (tree decl, tree object, tree qualifying_scope)
{ {
gcc_assert (TREE_CODE (decl) == FIELD_DECL); 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 (!object)
{ {
if (current_function_decl if (current_function_decl
...@@ -1433,7 +1443,8 @@ finish_non_static_data_member (tree decl, tree object, tree qualifying_scope) ...@@ -1433,7 +1443,8 @@ finish_non_static_data_member (tree decl, tree object, tree qualifying_scope)
return error_mark_node; 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) if (processing_template_decl && !qualifying_scope)
{ {
tree type = TREE_TYPE (decl); tree type = TREE_TYPE (decl);
...@@ -1443,7 +1454,9 @@ finish_non_static_data_member (tree decl, tree object, tree qualifying_scope) ...@@ -1443,7 +1454,9 @@ finish_non_static_data_member (tree decl, tree object, tree qualifying_scope)
else else
{ {
/* Set the cv qualifiers. */ /* 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)) if (DECL_MUTABLE_P (decl))
quals &= ~TYPE_QUAL_CONST; quals &= ~TYPE_QUAL_CONST;
......
...@@ -26,6 +26,12 @@ ...@@ -26,6 +26,12 @@
2009-03-31 Jason Merrill <jason@redhat.com> 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. * g++.dg/other/typedef2.C: New test.
PR c++/37806 PR c++/37806
......
...@@ -47,10 +47,10 @@ CHECK_DECLTYPE(decltype(caa.a), int); ...@@ -47,10 +47,10 @@ CHECK_DECLTYPE(decltype(caa.a), int);
class B { class B {
public: public:
int a; // { dg-error "invalid use" } int a;
enum B_enum { b }; enum B_enum { b };
decltype(a) c; // { dg-error "from this location" } decltype(a) c;
decltype(a) foo() { } // { dg-error "from this location" } decltype(a) foo() { }
decltype(b) enums_are_in_scope() { return b; } // ok decltype(b) enums_are_in_scope() { return b; } // ok
}; };
......
...@@ -3,6 +3,6 @@ ...@@ -3,6 +3,6 @@
struct S struct S
{ {
int i; // { dg-error "" } non-static data member int i;
__typeof( S::i ) f (); // { dg-error "" } referenced here __typeof( S::i ) f ();
}; };
...@@ -3,13 +3,13 @@ ...@@ -3,13 +3,13 @@
struct S struct S
{ {
int j; // { dg-error "" } non-static data member int j;
int i[2]; // { dg-error "" } non-static data member int i[2]; // { dg-error "" "" { xfail *-*-* } } non-static data member
}; };
void f () void f ()
{ {
sizeof (S::j); // { dg-error "" } used here sizeof (S::j);
sizeof (S::i[0]); // { dg-error "" } used here sizeof (S::i[0]); // { dg-error "" "" { xfail *-*-* } } used here
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment