Index: src/SynTree/Constant.cc
===================================================================
--- src/SynTree/Constant.cc	(revision 6896548fa6cba77903ac279c4d77b434bb762886)
+++ src/SynTree/Constant.cc	(revision 89faa82907bc300a63bff199051ce9533abffc68)
@@ -22,8 +22,7 @@
 #include "Type.h"    // for BasicType, Type, Type::Qualifiers, PointerType
 
-Constant::Constant( Type * type, std::string rep, unsigned long long val ) : type( type ), rep( rep ), val( val ) {}
-Constant::Constant( Type * type, std::string rep, double val ) : type( type ), rep( rep ), val( val ) {}
+Constant::Constant( Type * type, std::string rep, std::optional<unsigned long long> ival ) : type( type ), rep( rep ), ival( ival ) {}
 
-Constant::Constant( const Constant &other ) : BaseSyntaxNode( other ), rep( other.rep ), val( other.val ) {
+Constant::Constant( const Constant &other ) : BaseSyntaxNode( other ), rep( other.rep ), ival( other.ival ) {
 	type = other.type->clone();
 }
@@ -35,8 +34,4 @@
 }
 
-Constant Constant::from_char( char c ) {
-	return Constant( new BasicType( Type::Qualifiers(), BasicType::Char ), std::to_string( c ), (unsigned long long int)c );
-}
-
 Constant Constant::from_int( int i ) {
 	return Constant( new BasicType( Type::Qualifiers(), BasicType::SignedInt ), std::to_string( i ), (unsigned long long int)i );
@@ -45,18 +40,4 @@
 Constant Constant::from_ulong( unsigned long i ) {
 	return Constant( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ), std::to_string( i ), (unsigned long long int)i );
-}
-
-Constant Constant::from_double( double d ) {
-	return Constant( new BasicType( Type::Qualifiers(), BasicType::Double ), std::to_string( d ), d );
-}
-
-Constant Constant::from_string( std::string const & cEscapedVal, Type *charType ) {
-	assert(cEscapedVal.length() >= 2);
-	assert(cEscapedVal.front() == '"');
-	assert(cEscapedVal.back() == '"');
-	ArrayType * at = new ArrayType( noQualifiers, charType,
-									new ConstantExpr( Constant::from_ulong( cEscapedVal.size() + 1 - 2 ) ), // +1 for '\0' and -2 for '"'
-									false, false );
-	return Constant( at, cEscapedVal, (unsigned long long int)0 );
 }
 
@@ -74,14 +55,9 @@
 unsigned long long Constant::get_ival() const {
 	assertf( strict_dynamic_cast<BasicType*>(type)->isInteger(), "Attempt to retrieve ival from non-integer constant." );
-	return val.ival;
-}
-
-double Constant::get_dval() const {
-	assertf( ! strict_dynamic_cast<BasicType*>(type)->isInteger(), "Attempt to retrieve dval from integer constant." );
-	return val.dval;
+	return ival.value();
 }
 
 void Constant::print( std::ostream &os, Indenter ) const {
-	os << "(" << rep << " " << val.ival;
+	os << "(" << rep << " " << (ival ? toString(ival.value()) : "") ;
 	if ( type ) {
 		os << ": ";
Index: src/SynTree/Constant.h
===================================================================
--- src/SynTree/Constant.h	(revision 6896548fa6cba77903ac279c4d77b434bb762886)
+++ src/SynTree/Constant.h	(revision 89faa82907bc300a63bff199051ce9533abffc68)
@@ -18,4 +18,5 @@
 #include <iosfwd>     // for ostream
 #include <string>     // for string
+#include <optional>   // for optional
 
 #include "BaseSyntaxNode.h"
@@ -27,6 +28,5 @@
 class Constant : public BaseSyntaxNode {
   public:
-	Constant( Type * type, std::string rep, unsigned long long val );
-	Constant( Type * type, std::string rep, double val );
+	Constant( Type * type, std::string rep, std::optional<unsigned long long> i );
 	Constant( const Constant & other );
 	virtual ~Constant();
@@ -39,18 +39,11 @@
 	void set_value( std::string newValue ) { rep = newValue; }
 	unsigned long long get_ival() const;
-	double get_dval() const;
 
 	/// generates a boolean constant of the given bool
 	static Constant from_bool( bool b );
-	/// generates a char constant of the given char
-	static Constant from_char( char c );
 	/// generates an integer constant of the given int
 	static Constant from_int( int i );
 	/// generates an integer constant of the given unsigned long int
 	static Constant from_ulong( unsigned long i );
-	/// generates a floating point constant of the given double
-	static Constant from_double( double d );
-	/// generates an array of chars constant of the given string
-	static Constant from_string( std::string const & cEscapedVal, Type *charType  );
 
 	/// generates a null pointer value for the given type. void * if omitted.
@@ -63,10 +56,7 @@
 	Type * type;
 	std::string rep;
-	union Val {
-		unsigned long long ival;
-		double dval;
-		Val( unsigned long long ival ) : ival( ival ) {}
-		Val( double dval ) : dval( dval ) {}
-	} val;
+	std::optional<unsigned long long> ival;
+
+	friend class ConverterOldToNew;
 };
 
