111
|
1 /* Inspired by part of java/parse.y.
|
|
2 May be a real bug in CSE. */
|
|
3
|
|
4 /* { dg-do compile } */
|
|
5 /* { dg-options "-O2 -Wall" } */
|
|
6
|
|
7 struct tree
|
|
8 {
|
|
9 struct tree *car, *cdr, *wfl;
|
|
10 int code;
|
|
11 struct { unsigned int renp:1;
|
|
12 unsigned int rtnp:1;
|
|
13 unsigned int rpnp:1; } flags;
|
|
14 };
|
|
15 typedef struct tree *tree;
|
|
16 #define NULL_TREE ((tree)0)
|
|
17
|
|
18 /* Codes */
|
|
19 enum
|
|
20 {
|
|
21 CALL_EXPR, NEW_ARRAY_EXPR, NEW_CLASS_EXPR, CONVERT_EXPR,
|
|
22 ARRAY_REF, CONDITIONAL_EXPR, STRING_CST, EXPR_WITH_FILE_LOCATION
|
|
23 };
|
|
24
|
|
25 /* Flags */
|
|
26 #define RESOLVE_EXPRESSION_NAME_P(t) ((t)->flags.renp)
|
|
27 #define RESOLVE_TYPE_NAME_P(t) ((t)->flags.rtnp)
|
|
28 #define RESOLVE_PACKAGE_NAME_P(t) ((t)->flags.rpnp)
|
|
29
|
|
30 /* Macros */
|
|
31 #define EXPR_WFL_QUALIFICATION(t) ((t)->wfl)
|
|
32 #define QUAL_WFL(t) ((t)->wfl)
|
|
33 #define EXPR_WFL_NODE(t) ((t)->wfl)
|
|
34 #define TREE_CODE(t) ((t)->code)
|
|
35 #define TREE_OPERAND(t,x) ((t)->car)
|
|
36 #define CLASSTYPE_SUPER(t) ((t)->car)
|
|
37 #define IDENTIFIER_LOCAL_VALUE(t) ((t)->car)
|
|
38 #define TREE_CHAIN(t) ((t)->cdr)
|
|
39 #define QUAL_RESOLUTION(t) ((t)->cdr)
|
|
40
|
|
41 extern tree current_class, this_identifier_node;
|
|
42 extern tree super_identifier_node, length_identifier_node;
|
|
43
|
|
44 tree resolve_and_layout (tree, tree);
|
|
45 tree lookup_field_wrapper (tree, tree);
|
|
46
|
|
47 void
|
|
48 qualify_ambiguous_name (id)
|
|
49 tree id;
|
|
50 {
|
|
51 tree qual, qual_wfl, decl;
|
|
52 tree name; /* { dg-bogus "name" "uninitialized variable warning" } */
|
|
53 tree ptr_type; /* { dg-bogus "ptr_type" "uninitialized variable warning" } */
|
|
54 int again, new_array_found = 0;
|
|
55 int super_found = 0, this_found = 0;
|
|
56
|
|
57 qual = EXPR_WFL_QUALIFICATION (id);
|
|
58 do {
|
|
59 qual_wfl = QUAL_WFL (qual);
|
|
60 switch (TREE_CODE (qual_wfl))
|
|
61 {
|
|
62 case CALL_EXPR:
|
|
63 qual_wfl = TREE_OPERAND (qual_wfl, 0);
|
|
64 if (TREE_CODE (qual_wfl) != EXPR_WITH_FILE_LOCATION)
|
|
65 {
|
|
66 qual = EXPR_WFL_QUALIFICATION (qual_wfl);
|
|
67 qual_wfl = QUAL_WFL (qual);
|
|
68 }
|
|
69 break;
|
|
70 case NEW_ARRAY_EXPR:
|
|
71 qual = TREE_CHAIN (qual);
|
|
72 new_array_found = again = 1;
|
|
73 continue;
|
|
74 case NEW_CLASS_EXPR:
|
|
75 case CONVERT_EXPR:
|
|
76 qual_wfl = TREE_OPERAND (qual_wfl, 0);
|
|
77 break;
|
|
78 case ARRAY_REF:
|
|
79 while (TREE_CODE (qual_wfl) == ARRAY_REF)
|
|
80 qual_wfl = TREE_OPERAND (qual_wfl, 0);
|
|
81 break;
|
|
82 default:
|
|
83 break;
|
|
84 }
|
|
85
|
|
86 name = EXPR_WFL_NODE (qual_wfl);
|
|
87 ptr_type = current_class;
|
|
88 again = 0;
|
|
89
|
|
90 } while (again);
|
|
91
|
|
92 /* If you put straightforward uses of name and ptr_type here
|
|
93 instead of the if-else sequence below, the warnings go away.
|
|
94 Therefore I suspect a real bug. */
|
|
95
|
|
96 if (!this_found && !super_found && (decl = IDENTIFIER_LOCAL_VALUE (name)))
|
|
97 {
|
|
98 RESOLVE_EXPRESSION_NAME_P (qual_wfl) = 1;
|
|
99 QUAL_RESOLUTION (qual) = decl;
|
|
100 }
|
|
101 else if ((decl = lookup_field_wrapper (ptr_type, name))
|
|
102 || (new_array_found && name == length_identifier_node))
|
|
103 {
|
|
104 RESOLVE_EXPRESSION_NAME_P (qual_wfl) = 1;
|
|
105 QUAL_RESOLUTION (qual) = (new_array_found ? NULL_TREE : decl);
|
|
106 }
|
|
107 else if ((decl = resolve_and_layout (name, NULL_TREE)))
|
|
108 {
|
|
109 RESOLVE_TYPE_NAME_P (qual_wfl) = 1;
|
|
110 QUAL_RESOLUTION (qual) = decl;
|
|
111 }
|
|
112 else if (TREE_CODE (QUAL_WFL (qual)) == CALL_EXPR
|
|
113 || TREE_CODE (QUAL_WFL (qual)) == ARRAY_REF)
|
|
114 RESOLVE_EXPRESSION_NAME_P (qual_wfl) = 1;
|
|
115 else
|
|
116 RESOLVE_PACKAGE_NAME_P (qual_wfl) = 1;
|
|
117 }
|