blob: a2c9c04279f61954a830befa77f2cfe61e5b3d82 [file] [log] [blame]
// Build don't link:
//980529 bkoz
//3.4.5 Class member access via pointer and non-pointer
// non-nested dtor calls
int counter = 0;
struct X {
int rank;
X(int init = 64) : rank(init) { }
~X() { ++counter; }
typedef X classtype;
};
typedef X globaltype;
#if 0
template <typename T>
struct X_tem {
T rank;
X_tem(T init = T(64) ) : rank(init) { }
~X_tem() { ++counter; }
typedef X_tem classtype_tem;
};
typedef X_tem<int> globaltype_tem;
#endif
int main(void)
{
// 3.4.5 Class member access
// p 2
// if the id-expression in a class member access is an
// unqualified-id, and the type of the object expression is of class
// type C (or pointer to class type C), the unqualified-id is looked
// up in the scope of class C. If the type of the object-expression
// is of pointer to scalar type, the unqualified-id is looked up in
// the context of the complete postfix-expression.
// p 3
// if the unqualitified id is ~type-name, and the type of the object
// expression is of a class type C (or pointer to class type C), the
// type-name is looked up in the context of the entire
// postfix-expression and in the scope of class C. The type-name
// shall refer to a class-name. If type-name is found in both
// contexts, the name shall refer to the same class type. If the
// type of the object expression is of scalar type, the type-name is
// looked up in the complete postfix-expression.
typedef X localtype;
//
// 1 non-templatized, pointer, unqualified
//
X x01 ;
X *px = &x01;
px->~X();
X x02 (66);
px = &x02;
px->~localtype();
X x03 (68);
px = &x03;
px->~classtype(); //-g++ //p3: unqual-id lookup in object and postfix-expr
X x04 (70);
px = &x04;
px->~globaltype();
// p 1
// . . . the id-expression is first looked up in the class of the
// object-expression. If the identifier is not found, itis then
// looked up in the context of the entier postfix-expression and
// shall name a class or function template. If the lookup in the
// class of the object-expression finds a template, the name is also
// looked up in teh context of the entier postfix-expression and
// 1 if the name is not found, use the name from the object-expr
// 2 if the name found in postfix-expr != class template, use object-expr
// 3 if name found is class template, name must match object-expr or error
// p 4
// if the id-expr in a class member acess is a qualified-id, the
// id-expression is looked up in both the context of the entire
// postfix-expr and in the scope of the class of the object-expr. If
// the name is found in both contexts, the id-expr shall refer to
// the same entity.
//
// 2 non-templatized, pointer, qualified
//
X x05 ;
px = &x05;
px->X::~X();
X x06 (66);
px = &x06;
px->X::~localtype();
X x07 (68);
px = &x07;
px->X::~classtype(); // -edg
X x08 (70);
px = &x08;
px->X::~globaltype();
X x09 (66);
px = &x09;
px->localtype::~localtype();
X x10 (68);
px = &x10;
px->classtype::~classtype();
X x11 (70);
px = &x11;
px->globaltype::~globaltype();
X x12 (66);
px = &x12;
px->classtype::~localtype();
X x13 (68);
px = &x13;
px->globaltype::~localtype();
X x14 (70);
px = &x14;
px->localtype::~globaltype();
X x15 (70);
px = &x15;
px->classtype::~globaltype();
X x16 (70);
px = &x16;
px->localtype::~classtype(); //-edg
X x17 (70);
px = &x17;
px->globaltype::~classtype(); //-edg
#if 0
//
// non-templatized, non-pointer
//
X xo5 ;
xo5.~X(); //unqualified
localtype xo6 (66);
xo6.~localtype();
X xo7 (68);
xo7.~classtype();
X xo8 (70);
xo8.~globaltype();
//
// templatized, pointer
//
X_tem<int> xto1 ;
X_tem<int> *pxt = &xto1;
pxt->~X_tem(); //unqualified
typedef X_tem<int> localtype_tem;
localtype_tem xto2 (66);
pxt = &xto2;
pxt->~localtype_tem();
//paragraph 2: unqualitifed id looked up in scope of post-fix expr if object
X_tem<int> xto3 (68);
pxt = &xto3;
pxt->~classtype_tem();
X_tem<int> xto4 (70);
pxt = &xto4;
pxt->~globaltype_tem();
//
// templatized, non-pointer
//
X_tem<int> xto5 ;
xto5.~X_tem(); //unqualified
localtype_tem xto6 (66);
xto6.~localtype_tem();
X_tem<int> xto7 (68);
xto7.~classtype_tem();
X_tem<int> xto8 (70);
xto8.~globaltype_tem();
#endif
return 0;
}