summaryrefslogtreecommitdiff
path: root/gdb/stabsread.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/stabsread.c')
-rw-r--r--gdb/stabsread.c29
1 files changed, 27 insertions, 2 deletions
diff --git a/gdb/stabsread.c b/gdb/stabsread.c
index 4697b4067e7..0263e9e4c7b 100644
--- a/gdb/stabsread.c
+++ b/gdb/stabsread.c
@@ -1267,13 +1267,37 @@ symbol_reference_defined (char **string)
}
}
+static char *
+objc_find_colon (name)
+ char *name;
+{
+ char *s = name;
+ if (s[0] == '-' || *s == '+')
+ {
+ if (s[1] != '[')
+ {
+ error ("invalid symbol name \"%s\"", name);
+ }
+ s = strchr (s, ']');
+ if (s == NULL)
+ {
+ error ("invalid symbol name \"%s\"", name);
+ }
+ return strchr (s, ':');
+ }
+ else
+ {
+ return strchr (s, ':');
+ }
+}
+
/* ARGSUSED */
struct symbol *
define_symbol (CORE_ADDR valu, char *string, int desc, int type,
struct objfile *objfile)
{
register struct symbol *sym;
- char *p = (char *) strchr (string, ':');
+ char *p = (char *) objc_find_colon (string);
int deftype;
int synonym = 0;
register int i;
@@ -2006,7 +2030,8 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
a typedef for "foo". Unfortunately, cfront never makes the typedef
when translating C++ into C. We make the typedef here so that
"ptype foo" works as expected for cfront translated code. */
- else if (current_subfile->language == language_cplus)
+ else if ((current_subfile->language == language_cplus)
+ || (current_subfile->language == language_objc))
synonym = 1;
SYMBOL_TYPE (sym) = read_type (&p, objfile);