* expression.h (enum exp_opcode): Document OP_COMPLEX to take
authorUlrich Weigand <uweigand@de.ibm.com>
Thu, 11 Sep 2008 14:12:15 +0000 (14:12 +0000)
committerUlrich Weigand <uweigand@de.ibm.com>
Thu, 11 Sep 2008 14:12:15 +0000 (14:12 +0000)
a type parameter as expression element.
* eval.c (evaluate_subexp_standard) [OP_COMPLEX]: Retrieve result
type as expression element.
* f-exp.y: Pass in type when buildin OP_COMPLEX expression.
* parse.c (operator_length_standard): Update length of OP_COMPLEX.

gdb/ChangeLog
gdb/eval.c
gdb/expression.h
gdb/f-exp.y
gdb/parse.c

index 91869e43ca388f446079037135629465e5efe68f..f98c925855adb66cd22aa825788ba776817444f4 100644 (file)
@@ -1,3 +1,12 @@
+2008-09-11  Ulrich Weigand  <uweigand@de.ibm.com>
+
+       * expression.h (enum exp_opcode): Document OP_COMPLEX to take
+       a type parameter as expression element.
+       * eval.c (evaluate_subexp_standard) [OP_COMPLEX]: Retrieve result
+       type as expression element.
+       * f-exp.y: Pass in type when buildin OP_COMPLEX expression.
+       * parse.c (operator_length_standard): Update length of OP_COMPLEX.
+
 2008-09-11  Ulrich Weigand  <uweigand@de.ibm.com>
 
        * language.h (struct language_arch_info): New members
index 9086e1b6b95558855092cc3d68e1c474f6146756..92b2d72e97037b98318b16aa54d5b0d965b65511 100644 (file)
@@ -1369,10 +1369,11 @@ evaluate_subexp_standard (struct type *expect_type,
     case OP_COMPLEX:
       /* We have a complex number, There should be 2 floating 
          point numbers that compose it */
+      (*pos) += 2;
       arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
       arg2 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
 
-      return value_literal_complex (arg1, arg2, builtin_type_f_complex_s16);
+      return value_literal_complex (arg1, arg2, exp->elts[pc + 1].type);
 
     case STRUCTOP_STRUCT:
       tem = longest_to_int (exp->elts[pc + 1].longconst);
index 4590febe804fb41a91261697670febbdc33cfafd..fe5f8fc9a48cc043ff77acc9ea1251322e40dd73 100644 (file)
@@ -193,8 +193,9 @@ enum exp_opcode
        indicates that we have found something of the form <name> ( <stuff> ) */
     OP_F77_UNDETERMINED_ARGLIST,
 
-    /* The following OP is a special one, it introduces a F77 complex
-       literal. It is followed by exactly two args that are doubles.  */
+    /* OP_COMPLEX takes a type in the following element, followed by another
+       OP_COMPLEX, making three exp_elements.  It is followed by two double
+       args, and converts them into a complex number of the given type. */
     OP_COMPLEX,
 
     /* OP_STRING represents a string constant.
index 1aacc3782372b1277f52d08205c117e6d2866b47..108f1bde41460b7e35582d79849f189220fbaa97 100644 (file)
@@ -328,7 +328,9 @@ complexnum:     exp ',' exp
         ;
 
 exp    :       '(' complexnum ')'
-                       { write_exp_elt_opcode(OP_COMPLEX); }
+                       { write_exp_elt_opcode(OP_COMPLEX);
+                         write_exp_elt_type (parse_f_type->builtin_complex_s16);
+                         write_exp_elt_opcode(OP_COMPLEX); }
        ;
 
 exp    :       '(' type ')' exp  %prec UNARY
index e3a62c7a2f096d16f7fb5d73322f39df72e24d38..2a6b8cb25d8e67b38980ca6c0a276a905d84b60d 100644 (file)
@@ -767,7 +767,7 @@ operator_length_standard (struct expression *expr, int endpos,
       break;
 
     case OP_COMPLEX:
-      oplen = 1;
+      oplen = 3;
       args = 2;
       break;