diff options
author | Ian Lance Taylor <ian@gcc.gnu.org> | 2019-09-09 19:06:46 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2019-09-09 19:06:46 +0000 |
commit | 4f0eaba24dfb46dd4b45251231fdf006a70888c5 (patch) | |
tree | d0782d4967aee04144404ec19460fdcae467cf4a /gcc/go | |
parent | 0b0310e9a0e0d553bbe9f961c52e0851328aa8b0 (diff) | |
download | gcc-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/MERGE | 2 | ||||
-rw-r--r-- | gcc/go/gofrontend/expressions.cc | 67 | ||||
-rw-r--r-- | gcc/go/gofrontend/expressions.h | 3 |
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; } |