| /* Inspired by part of java/parse.y. |
| May be a real bug in CSE. */ |
| |
| /* { dg-do compile } */ |
| /* { dg-options "-O2 -Wall" } */ |
| |
| struct tree |
| { |
| struct tree *car, *cdr, *wfl; |
| int code; |
| struct { unsigned int renp:1; |
| unsigned int rtnp:1; |
| unsigned int rpnp:1; } flags; |
| }; |
| typedef struct tree *tree; |
| #define NULL_TREE ((tree)0) |
| |
| /* Codes */ |
| enum |
| { |
| CALL_EXPR, NEW_ARRAY_EXPR, NEW_CLASS_EXPR, CONVERT_EXPR, |
| ARRAY_REF, CONDITIONAL_EXPR, STRING_CST, EXPR_WITH_FILE_LOCATION |
| }; |
| |
| /* Flags */ |
| #define RESOLVE_EXPRESSION_NAME_P(t) ((t)->flags.renp) |
| #define RESOLVE_TYPE_NAME_P(t) ((t)->flags.rtnp) |
| #define RESOLVE_PACKAGE_NAME_P(t) ((t)->flags.rpnp) |
| |
| /* Macros */ |
| #define EXPR_WFL_QUALIFICATION(t) ((t)->wfl) |
| #define QUAL_WFL(t) ((t)->wfl) |
| #define EXPR_WFL_NODE(t) ((t)->wfl) |
| #define TREE_CODE(t) ((t)->code) |
| #define TREE_OPERAND(t,x) ((t)->car) |
| #define CLASSTYPE_SUPER(t) ((t)->car) |
| #define IDENTIFIER_LOCAL_VALUE(t) ((t)->car) |
| #define TREE_CHAIN(t) ((t)->cdr) |
| #define QUAL_RESOLUTION(t) ((t)->cdr) |
| |
| extern tree current_class, this_identifier_node; |
| extern tree super_identifier_node, length_identifier_node; |
| |
| tree resolve_and_layout (tree, tree); |
| tree lookup_field_wrapper (tree, tree); |
| |
| void |
| qualify_ambiguous_name (id) |
| tree id; |
| { |
| tree qual, qual_wfl, decl; |
| tree name; /* { dg-bogus "name" "uninitialized variable warning" } */ |
| tree ptr_type; /* { dg-bogus "ptr_type" "uninitialized variable warning" } */ |
| int again, new_array_found = 0; |
| int super_found = 0, this_found = 0; |
| |
| qual = EXPR_WFL_QUALIFICATION (id); |
| do { |
| qual_wfl = QUAL_WFL (qual); |
| switch (TREE_CODE (qual_wfl)) |
| { |
| case CALL_EXPR: |
| qual_wfl = TREE_OPERAND (qual_wfl, 0); |
| if (TREE_CODE (qual_wfl) != EXPR_WITH_FILE_LOCATION) |
| { |
| qual = EXPR_WFL_QUALIFICATION (qual_wfl); |
| qual_wfl = QUAL_WFL (qual); |
| } |
| break; |
| case NEW_ARRAY_EXPR: |
| qual = TREE_CHAIN (qual); |
| new_array_found = again = 1; |
| continue; |
| case NEW_CLASS_EXPR: |
| case CONVERT_EXPR: |
| qual_wfl = TREE_OPERAND (qual_wfl, 0); |
| break; |
| case ARRAY_REF: |
| while (TREE_CODE (qual_wfl) == ARRAY_REF) |
| qual_wfl = TREE_OPERAND (qual_wfl, 0); |
| break; |
| default: |
| break; |
| } |
| |
| name = EXPR_WFL_NODE (qual_wfl); |
| ptr_type = current_class; |
| again = 0; |
| |
| } while (again); |
| |
| /* If you put straightforward uses of name and ptr_type here |
| instead of the if-else sequence below, the warnings go away. |
| Therefore I suspect a real bug. */ |
| |
| if (!this_found && !super_found && (decl = IDENTIFIER_LOCAL_VALUE (name))) |
| { |
| RESOLVE_EXPRESSION_NAME_P (qual_wfl) = 1; |
| QUAL_RESOLUTION (qual) = decl; |
| } |
| else if ((decl = lookup_field_wrapper (ptr_type, name)) |
| || (new_array_found && name == length_identifier_node)) |
| { |
| RESOLVE_EXPRESSION_NAME_P (qual_wfl) = 1; |
| QUAL_RESOLUTION (qual) = (new_array_found ? NULL_TREE : decl); |
| } |
| else if ((decl = resolve_and_layout (name, NULL_TREE))) |
| { |
| RESOLVE_TYPE_NAME_P (qual_wfl) = 1; |
| QUAL_RESOLUTION (qual) = decl; |
| } |
| else if (TREE_CODE (QUAL_WFL (qual)) == CALL_EXPR |
| || TREE_CODE (QUAL_WFL (qual)) == ARRAY_REF) |
| RESOLVE_EXPRESSION_NAME_P (qual_wfl) = 1; |
| else |
| RESOLVE_PACKAGE_NAME_P (qual_wfl) = 1; |
| } |