aboutsummaryrefslogtreecommitdiff
path: root/gcc/go
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>2019-09-09 19:06:46 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2019-09-09 19:06:46 +0000
commit4f0eaba24dfb46dd4b45251231fdf006a70888c5 (patch)
treed0782d4967aee04144404ec19460fdcae467cf4a /gcc/go
parent0b0310e9a0e0d553bbe9f961c52e0851328aa8b0 (diff)
downloadgcc-4f0eaba24dfb46dd4b45251231fdf006a70888c5.zip
gcc-4f0eaba24dfb46dd4b45251231fdf006a70888c5.tar.gz
gcc-4f0eaba24dfb46dd4b45251231fdf006a70888c5.tar.bz2
compiler: traverse types of constant expressions
We forgot to ever traverse types of constant expressions. This rarely makes a difference--evidently, since nobody noticed--but it does matter when we inline constant expressions: we need to ensure that the type is visible to the importing code. Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/194317 From-SVN: r275539
Diffstat (limited to 'gcc/go')
-rw-r--r--gcc/go/gofrontend/MERGE2
-rw-r--r--gcc/go/gofrontend/expressions.cc67
-rw-r--r--gcc/go/gofrontend/expressions.h3
3 files changed, 71 insertions, 1 deletions
diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE
index 7b2d17e..d966638 100644
--- a/gcc/go/gofrontend/MERGE
+++ b/gcc/go/gofrontend/MERGE
@@ -1,4 +1,4 @@
-8f2b844acda70330f7c50b360f8c983d2676ecbb
+28c9053b3d507bef7bd56cb01c6b22deea354cdd
The first line of this file holds the git revision number of the last
merge done from the gofrontend repository.
diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc
index 4db4e4a..cb09ec0 100644
--- a/gcc/go/gofrontend/expressions.cc
+++ b/gcc/go/gofrontend/expressions.cc
@@ -1812,6 +1812,9 @@ class Boolean_expression : public Expression
do_import(Import_expression*, Location);
protected:
+ int
+ do_traverse(Traverse*);
+
bool
do_is_constant() const
{ return true; }
@@ -1864,6 +1867,17 @@ class Boolean_expression : public Expression
Type* type_;
};
+// Traverse a boolean expression. We just need to traverse the type
+// if there is one.
+
+int
+Boolean_expression::do_traverse(Traverse* traverse)
+{
+ if (this->type_ != NULL)
+ return Type::traverse(this->type_, traverse);
+ return TRAVERSE_CONTINUE;
+}
+
// Get the type.
Type*
@@ -1916,6 +1930,17 @@ Expression::make_boolean(bool val, Location location)
// Class String_expression.
+// Traverse a string expression. We just need to traverse the type
+// if there is one.
+
+int
+String_expression::do_traverse(Traverse* traverse)
+{
+ if (this->type_ != NULL)
+ return Type::traverse(this->type_, traverse);
+ return TRAVERSE_CONTINUE;
+}
+
// Get the type.
Type*
@@ -2290,6 +2315,9 @@ class Integer_expression : public Expression
dump_integer(Ast_dump_context* ast_dump_context, const mpz_t val);
protected:
+ int
+ do_traverse(Traverse*);
+
bool
do_is_constant() const
{ return true; }
@@ -2353,6 +2381,17 @@ class Integer_expression : public Expression
bool is_character_constant_;
};
+// Traverse an integer expression. We just need to traverse the type
+// if there is one.
+
+int
+Integer_expression::do_traverse(Traverse* traverse)
+{
+ if (this->type_ != NULL)
+ return Type::traverse(this->type_, traverse);
+ return TRAVERSE_CONTINUE;
+}
+
// Return a numeric constant for this expression. We have to mark
// this as a character when appropriate.
@@ -2714,6 +2753,9 @@ class Float_expression : public Expression
dump_float(Ast_dump_context* ast_dump_context, const mpfr_t val);
protected:
+ int
+ do_traverse(Traverse*);
+
bool
do_is_constant() const
{ return true; }
@@ -2773,6 +2815,17 @@ class Float_expression : public Expression
Type* type_;
};
+// Traverse a float expression. We just need to traverse the type if
+// there is one.
+
+int
+Float_expression::do_traverse(Traverse* traverse)
+{
+ if (this->type_ != NULL)
+ return Type::traverse(this->type_, traverse);
+ return TRAVERSE_CONTINUE;
+}
+
// Return the current type. If we haven't set the type yet, we return
// an abstract float type.
@@ -2932,6 +2985,9 @@ class Complex_expression : public Expression
dump_complex(Ast_dump_context* ast_dump_context, const mpc_t val);
protected:
+ int
+ do_traverse(Traverse*);
+
bool
do_is_constant() const
{ return true; }
@@ -2995,6 +3051,17 @@ class Complex_expression : public Expression
Type* type_;
};
+// Traverse a complex expression. We just need to traverse the type
+// if there is one.
+
+int
+Complex_expression::do_traverse(Traverse* traverse)
+{
+ if (this->type_ != NULL)
+ return Type::traverse(this->type_, traverse);
+ return TRAVERSE_CONTINUE;
+}
+
// Return the current type. If we haven't set the type yet, we return
// an abstract complex type.
diff --git a/gcc/go/gofrontend/expressions.h b/gcc/go/gofrontend/expressions.h
index 4c743da..2e3d1e0 100644
--- a/gcc/go/gofrontend/expressions.h
+++ b/gcc/go/gofrontend/expressions.h
@@ -1670,6 +1670,9 @@ class String_expression : public Expression
do_import(Import_expression*, Location);
protected:
+ int
+ do_traverse(Traverse*);
+
bool
do_is_constant() const
{ return true; }