2002-08-19  David Carlton  <carlton@math.stanford.edu>
 
+       * valops.c (search_struct_field): Change error message to treat
+       return value of 0 from value_static_field as meaning that field is
+       optimized out.
+       (value_struct_elt_for_reference): Ditto.
+       * values.c (value_static_field): Treat an unresolved location the
+       same as a nonexistent symbol.  Fix PR gdb/635.
        * gnu-v2-abi.c (gnuv2_value_rtti_type): Eliminate test for being
        enclosed.  Fix PR gdb/574.
        * MAINTAINERS: Add self to Write After Approval list.
 
          {
            struct value *v;
            if (TYPE_FIELD_STATIC (type, i))
-             v = value_static_field (type, i);
+             {
+               v = value_static_field (type, i);
+               if (v == 0)
+                 error ("field %s is nonexistent or has been optimised out",
+                        name);
+             }
            else
-             v = value_primitive_field (arg1, offset, i, type);
-           if (v == 0)
-             error ("there is no field named %s", name);
+             {
+               v = value_primitive_field (arg1, offset, i, type);
+               if (v == 0)
+                 error ("there is no field named %s", name);
+             }
            return v;
          }
 
            {
              v = value_static_field (t, i);
              if (v == NULL)
-               error ("Internal error: could not find static variable %s",
+               error ("static field %s has been optimized out",
                       name);
              return v;
            }
 
 }
 
 \f
-/* Get the value of the FIELDN'th field (which must be static) of TYPE. */
+/* Get the value of the FIELDN'th field (which must be static) of
+   TYPE.  Return NULL if the field doesn't exist or has been
+   optimized out. */
 
 struct value *
 value_static_field (struct type *type, int fieldno)
     {
       char *phys_name = TYPE_FIELD_STATIC_PHYSNAME (type, fieldno);
       struct symbol *sym = lookup_symbol (phys_name, 0, VAR_NAMESPACE, 0, NULL);
-      if (sym == NULL)
+      /* In some cases (involving uninitalized, unreferenced static
+        const integral members), g++ -gdwarf-2 can emit debugging
+        information giving rise to symbols whose SYMBOL_CLASS is
+        LOC_UNRESOLVED.  In that case, do a minimal symbol lookup.
+        If it returns a useful value, then the symbol was defined
+        elsewhere, so we use that information.  Otherwise, return
+        NULL. */
+      if (sym == NULL || SYMBOL_CLASS (sym) == LOC_UNRESOLVED)
        {
          /* With some compilers, e.g. HP aCC, static data members are reported
             as non-debuggable symbols */