diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2012-09-17 08:17:06 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2012-09-17 08:17:06 +0200 |
commit | 76088fe3dfdf541281942b43cb72b021b6fd2ee3 (patch) | |
tree | d85ded1a5f23b0227914a1841e4323e91b2170ad /odb/relational | |
parent | 9b7f203f1f8a40765649312442efa9602335f757 (diff) |
Convert integer and floating default values immediately2.1.0
It appears that GCC 4.8 reuses token tree nodes that are returned
during pragma parsing. So saving such nodes for later no longer works.
Diffstat (limited to 'odb/relational')
-rw-r--r-- | odb/relational/model.cxx | 72 |
1 files changed, 10 insertions, 62 deletions
diff --git a/odb/relational/model.cxx b/odb/relational/model.cxx index 48c9bd2..6b8db1b 100644 --- a/odb/relational/model.cxx +++ b/odb/relational/model.cxx @@ -2,12 +2,6 @@ // copyright : Copyright (c) 2009-2012 Code Synthesis Tools CC // license : GNU GPL v3; see accompanying LICENSE file -#include <odb/gcc.hxx> - -#include <cassert> -#include <limits> -#include <sstream> - #include <odb/diagnostics.hxx> #include <odb/relational/model.hxx> @@ -39,77 +33,31 @@ namespace relational { case default_value::reset: { - // No default value. - return ""; + return ""; // No default value. } case default_value::null: { return default_null (m); - break; } case default_value::boolean: { - return default_bool (m, dv->value == "true"); - break; + return default_bool (m, dv->literal == "true"); + } + case default_value::integer: + { + return default_integer (m, dv->int_value, dv->literal == "-"); } - case default_value::number: + case default_value::floating: { - tree n (dv->node); - - switch (TREE_CODE (n)) - { - case INTEGER_CST: - { - HOST_WIDE_INT hwl (TREE_INT_CST_LOW (n)); - HOST_WIDE_INT hwh (TREE_INT_CST_HIGH (n)); - - unsigned long long l (hwl); - unsigned long long h (hwh); - unsigned short width (HOST_BITS_PER_WIDE_INT); - - unsigned long long v ((h << width) + l); - - return default_integer (m, v, dv->value == "-"); - break; - } - case REAL_CST: - { - double v; - - REAL_VALUE_TYPE d (TREE_REAL_CST (n)); - - if (REAL_VALUE_ISINF (d)) - v = numeric_limits<double>::infinity (); - else if (REAL_VALUE_ISNAN (d)) - v = numeric_limits<double>::quiet_NaN (); - else - { - char tmp[256]; - real_to_decimal (tmp, &d, sizeof (tmp), 0, true); - istringstream is (tmp); - is >> v; - } - - if (dv->value == "-") - v = -v; - - return default_float (m, v); - break; - } - default: - assert (false); - } - break; + return default_float (m, dv->float_value); } case default_value::string: { - return default_string (m, dv->value); - break; + return default_string (m, dv->literal); } case default_value::enumerator: { - return default_enum (m, dv->node, dv->value); - break; + return default_enum (m, dv->enum_value, dv->literal); } } |