Index: src/Parser/DeclarationNode.cpp
===================================================================
--- src/Parser/DeclarationNode.cpp	(revision 5b643eacb610dbfc2b4d7da3386b4a4b3c58cc79)
+++ src/Parser/DeclarationNode.cpp	(revision afb15cfcfe805e4a6a4f0f183c6d2fcd6a5137bb)
@@ -999,4 +999,10 @@
 	assert( type );
 
+	// Some types are parsed as declarations and, syntactically, can have
+	// initializers. However, semantically, this is meaningless.
+	if ( initializer ) {
+		SemanticError( this, "Initializer on type declaration " );
+	}
+
 	switch ( type->kind ) {
 	case TypeData::Aggregate: {
Index: tests/.expect/opt-params.txt
===================================================================
--- tests/.expect/opt-params.txt	(revision afb15cfcfe805e4a6a4f0f183c6d2fcd6a5137bb)
+++ tests/.expect/opt-params.txt	(revision afb15cfcfe805e4a6a4f0f183c6d2fcd6a5137bb)
@@ -0,0 +1,12 @@
+opt-params.cfa:12:1 error: Initializer on type declaration i: int 
+  with initializer  maybe constructed? 1
+
+opt-params.cfa:13:1 error: Initializer on type declaration int 
+  with initializer  maybe constructed? 1
+
+opt-params.cfa:14:1 error: Initializer on type declaration int 
+  with initializer  maybe constructed? 1
+
+opt-params.cfa:15:1 error: Initializer on type declaration int 
+  with initializer  maybe constructed? 1
+
Index: tests/Makefile.am
===================================================================
--- tests/Makefile.am	(revision 5b643eacb610dbfc2b4d7da3386b4a4b3c58cc79)
+++ tests/Makefile.am	(revision afb15cfcfe805e4a6a4f0f183c6d2fcd6a5137bb)
@@ -210,6 +210,8 @@
 CFACOMPILE_SYNTAX = ${CFACOMPILETEST} -Wno-unused-variable -Wno-unused-label -c -fsyntax-only -o ${abspath ${@}}
 
-SYNTAX_ONLY_CODE = expression typedefRedef variableDeclarator switch numericConstants identFuncDeclarator \
-	init1 limits nested-types cast ctrl-flow/labelledExit array quasiKeyword include/stdincludes include/includes builtins/sync warnings/self-assignment concurrency/waitfor/parse
+SYNTAX_ONLY_CODE = \
+	array cast expression identFuncDeclarator init1 limits nested-types numericConstants opt-params quasiKeyword switch typedefRedef variableDeclarator \
+	builtins/sync concurrency/waitfor/parse ctrl-flow/labelledExit include/stdincludes include/includes warnings/self-assignment
+
 ${SYNTAX_ONLY_CODE} : % : %.cfa ${CFACCBIN}
 	${CFACOMPILE_SYNTAX}
Index: tests/opt-params.cfa
===================================================================
--- tests/opt-params.cfa	(revision afb15cfcfe805e4a6a4f0f183c6d2fcd6a5137bb)
+++ tests/opt-params.cfa	(revision afb15cfcfe805e4a6a4f0f183c6d2fcd6a5137bb)
@@ -0,0 +1,16 @@
+// Check that function declarations can have optional parameters, but
+// function types cannot.
+
+void good_cases(
+	int start = 0,
+	int = -1
+);
+
+// This is a slightly weird way to do it, but it let's us try all the cases
+// before any of the errors cause compilation to stop.
+void bad_cases(
+	int (*fee)( int i = 10 ),
+	int (*fie)( int = 10 ),
+	void feo( int (*p)( int = 10 ) ),
+	void fum( int (*)( int = 10 ) )
+);
