blob: b67606ac19302d918c4487d9b99ec87b838621d5 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
// { dg-do assemble }
// 980604 bkoz
// 3.4.5 Class member access p 4
// nested and non-nested calls, no dtors
struct L {
int ii;
void foo(int a) {++a;}
struct Linner {
int ii_inner;
void foo_inner(int b) {++b;}
};
};
class A : public L {};
class B : public L {};
class C : public A, public B {};
void foo() {
// straight call
C x;
x.A::ii = 5;
x.A::foo(x.A::ii);
// 5.1 Primary expressions
// p 8
// a nested name specifier that names a class,
// optionally followed by the keyword template and then followd by
// the name of a member of either that class or one of its base
// classes is a qualified-id. (3.4.3.1 describes their lookup.)
// 5.2.5 Class memember access
// p 3 if E1 has the type 'pointer to class X' then
// E1->E2 == (*(E1)).E32
// E1 == object-expression
// E2 == id-expression
// thus everything gets converted to the "." notation
// p 2
// the id-expression shall name a member of the class
// (object-expression) or of one of its base classes.
// p4 if E2 is a nested type (of the object-expression), tye
// expression E1.E2 is ill formed.
// try 1 nested call - ERROR
#if 0
C x2;
x2.A::L::Linner::ii_inner = 6; //ERROR violates p2, does not name member of C
x2.A::L::Linner::foo_inner(x2.A::L::Linner::ii_inner);
#endif
//try2: scoped method call -edg +acc +g++
#if 1
C::A::Linner x2;
x2.A::Linner::ii_inner = 6;
x2.A::Linner::foo_inner(x2.A::Linner::ii_inner);
#endif
//try 3: non-scoped method call -edg +acc +g++
#if 0
C::A::L::Linner x3;
x3.ii_inner = 6;
x3.foo_inner(x3.ii_inner);
#endif
}
|