From 78406602be0ce392224dd3735ad9a9442df572f7 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Thu, 20 Oct 2016 14:03:05 +0200 Subject: When assigning always ignore existing value type For example: x = [uint64] 1 x = a # Ok. --- build2/parser.cxx | 42 ++++++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 20 deletions(-) (limited to 'build2/parser.cxx') diff --git a/build2/parser.cxx b/build2/parser.cxx index 1ecf808..dfe85be 100644 --- a/build2/parser.cxx +++ b/build2/parser.cxx @@ -1594,31 +1594,33 @@ namespace build2 // be the same. Also check that the requested value type doesn't conflict // with the variable type. // - if (type != nullptr) + if (type != nullptr && + var != nullptr && + var->type != nullptr && + var->type != type) { - if (var != nullptr && var->type != nullptr && var->type != type) - fail (l) << "conflicting variable " << var->name << " type " - << var->type->name << " and value type " << type->name; + fail (l) << "conflicting variable " << var->name << " type " + << var->type->name << " and value type " << type->name; + } - if (kind == type::assign) - { - if (type != v.type) - { - v = nullptr; // Clear old value. - v.type = type; - } - } - else + if (kind == type::assign) + { + if (type != v.type) { - if (!v) - v.type = type; - else if (v.type == nullptr) - typify (v, *type, var); - else if (v.type != type) - fail (l) << "conflicting original value type " << v.type->name - << " and append/prepend value type " << type->name; + v = nullptr; // Clear old value. + v.type = type; } } + else if (type != nullptr) + { + if (!v) + v.type = type; + else if (v.type == nullptr) + typify (v, *type, var); + else if (v.type != type) + fail (l) << "conflicting original value type " << v.type->name + << " and append/prepend value type " << type->name; + } if (null) { -- cgit v1.1