PR c++/14177 - Fix parsing TYPENAME:: in parentheses.
	* c-exp.y (classify_inner_name): Remove caller assumptions in the
	function comment.  Return ERROR for unresolved cases.  Implement
	returning proper NAME.
	(yylex): Accept also NAME from classify_inner_name.
	* cp-namespace.c (cp_lookup_nested_type): Rename to ...
	(cp_lookup_nested_symbol): ... here.  Return any found symbol, not just
	LOC_TYPEDEF type.
	* cp-support.h (cp_lookup_nested_type): Update its declaration.

gdb/testsuite/
	PR c++/14177 - Fix parsing TYPENAME:: in parentheses.
	* gdb.cp/cpexprs.cc (class CV, CV::i, ATTRIBUTE_USED, CV_f): New.
	(test_function): Call CV_f.
	* gdb.cp/cpexprs.exp (p 'CV::m(int)', p CV::m(int))
	(p 'CV::m(int) const', p CV::m(int) const, p 'CV::m(int) volatile')
	(p CV::m(int) volatile, p 'CV::m(int) const volatile')
	(p CV::m(int) const volatile, p CV_f(int), p CV_f(CV::t))
	(p CV_f(CV::i)): New tests.
This commit is contained in:
Jan Kratochvil
2012-06-13 16:10:10 +00:00
parent d55637df69
commit 50af5481d5
7 changed files with 104 additions and 27 deletions

View File

@ -660,14 +660,14 @@ lookup_symbol_file (const char *name,
return sym;
}
/* Look up a type named NESTED_NAME that is nested inside the C++
/* Look up a symbol named NESTED_NAME that is nested inside the C++
class or namespace given by PARENT_TYPE, from within the context
given by BLOCK. Return NULL if there is no such nested type. */
struct type *
cp_lookup_nested_type (struct type *parent_type,
const char *nested_name,
const struct block *block)
struct symbol *
cp_lookup_nested_symbol (struct type *parent_type,
const char *nested_name,
const struct block *block)
{
/* type_name_no_tag_required provides better error reporting using the
original type. */
@ -694,8 +694,8 @@ cp_lookup_nested_type (struct type *parent_type,
block, VAR_DOMAIN);
char *concatenated_name;
if (sym != NULL && SYMBOL_CLASS (sym) == LOC_TYPEDEF)
return SYMBOL_TYPE (sym);
if (sym != NULL)
return sym;
/* Now search all static file-level symbols. Not strictly
correct, but more useful than an error. We do not try to
@ -707,16 +707,15 @@ cp_lookup_nested_type (struct type *parent_type,
+ strlen (nested_name) + 1);
sprintf (concatenated_name, "%s::%s",
parent_name, nested_name);
sym = lookup_static_symbol_aux (concatenated_name,
VAR_DOMAIN);
if (sym != NULL && SYMBOL_CLASS (sym) == LOC_TYPEDEF)
return SYMBOL_TYPE (sym);
sym = lookup_static_symbol_aux (concatenated_name, VAR_DOMAIN);
if (sym != NULL)
return sym;
return NULL;
}
default:
internal_error (__FILE__, __LINE__,
_("cp_lookup_nested_type called "
_("cp_lookup_nested_symbol called "
"on a non-aggregate type."));
}
}