Index: src/AST/Decl.hpp
===================================================================
--- src/AST/Decl.hpp	(revision 3e46cc890712bac4ef8cd31cefe49990de638dbe)
+++ src/AST/Decl.hpp	(revision 77a3f416bd941156b036664f1e76d7be6f4a8d2a)
@@ -34,4 +34,5 @@
 class Attribute;
 class Expr;
+class Init;
 class TypeDecl;
 
@@ -84,5 +85,5 @@
 
 	/// Get type of this declaration. May be generated by subclass
-	virtual const Type* type() const = 0;
+	virtual const Type* get_type() const = 0;
 	/// Set type of this declaration. May be verified by subclass
 	virtual void set_type(Type*) = 0;
@@ -91,4 +92,25 @@
 private:
 	virtual DeclWithType* clone() const override = 0;
+};
+
+/// Object declaration `Foo foo = 42;`
+class ObjectDecl final : public DeclWithType {
+public:
+	ptr<Type> type;
+	ptr<Init> init;
+	ptr<Expr> bitfieldWidth;
+
+	ObjectDecl( const CodeLocation& loc, const std::string& name, Type* type, Init* init = nullptr,
+		Storage::Classes storage = {}, Linkage::Spec linkage = Linkage::C, Expr* bitWd = nullptr, 
+		std::vector<ptr<Attribute>>&& attrs = {}, Function::Specs fs = {})
+	: DeclWithType( loc, name, storage, linkage, std::move(attrs), fs ), type( type ), 
+	  init( init ), bitfieldWidth( bitWd ) {}
+	
+	const Type* get_type() const override { return type; }
+	void set_type( Type* ty ) override { type = ty; }
+
+	DeclWithType* accept( Visitor& v ) override { return v.visit( this ); }
+private:
+	ObjectDecl* clone() const override { return new ObjectDecl{ *this }; }
 };
 
Index: src/AST/porting.md
===================================================================
--- src/AST/porting.md	(revision 3e46cc890712bac4ef8cd31cefe49990de638dbe)
+++ src/AST/porting.md	(revision 77a3f416bd941156b036664f1e76d7be6f4a8d2a)
@@ -82,6 +82,10 @@
 * When `SymTab::Validate::Pass2` is rewritten, update comment on `mangleName` with new name of pass
 * `get_scopedMangleName()` => `scopedMangleName()`
-* `get_type()` => `type()`
-  * now returns `const Type*` so can't be inadvertently mutated
+* `get_type()` now returns `const Type*` so can't be inadvertently mutated
+  * still with `get_` name so it doesn't conflict with subclass field names
+
+`ObjectDecl`
+* changed constructor parameter order for better defaults
+  * allows `newObject` as just default settings
 
 `EnumDecl`
