2006-05-02 Mark Mitchell <mark@codesourcery.com>
+ PR c++/27102
+ * decl.c (grokdeclarator): Robustify checks for defining members
+ of incomplete types.
+
PR c++/27309
* class.c (add_method): Call grok_special_member_properties.
* decl.c (grokdeclarator): Don't call it here.
else if (/* If the qualifying type is already complete, then we
can skip the following checks. */
!COMPLETE_TYPE_P (ctype)
- /* If a function is being defined, then the qualifying
- type must be complete. The qualifying type may be
- incomplete for a declaration only if the qualifying
- type is one of the classes presently being defined,
- or if it is a dependent type. */
- && (funcdef_flag
+ && (/* If the function is being defined, then
+ qualifying type must certainly be complete. */
+ funcdef_flag
+ /* A friend declaration of "T::f" is OK, even if
+ "T" is a template parameter. But, if this
+ function is not a friend, the qualifying type
+ must be a class. */
+ || (!friendp && !CLASS_TYPE_P (ctype))
+ /* For a declaration, the type need not be
+ complete, if either it is dependent (since there
+ is no meaningful definition of complete in that
+ case) or the qualifying class is currently being
+ defined. */
|| !(dependent_type_p (ctype)
|| currently_open_class (ctype)))
/* Check that the qualifying type is complete. */