changeset 717:a26b0c5d5942

Merged DMD 1.036. Improved comments a little in the runtime source code.
author Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
date Wed, 22 Oct 2008 17:06:17 +0200
parents b654bb98d31d
children 72ee105be27b
files dmd/cast.c dmd/constfold.c dmd/expression.c dmd/func.c dmd/impcnvgen.c dmd/impcnvtab.c dmd/lexer.c dmd/lexer.h dmd/mars.c dmd/mtype.c dmd/parse.c runtime/internal/aaA.d runtime/internal/adi.d runtime/internal/lifetime.d
diffstat 14 files changed, 400 insertions(+), 323 deletions(-) [+]
line wrap: on
line diff
--- a/dmd/cast.c	Wed Oct 22 15:35:46 2008 +0200
+++ b/dmd/cast.c	Wed Oct 22 17:06:17 2008 +0200
@@ -324,8 +324,8 @@
 MATCH NullExp::implicitConvTo(Type *t)
 {
 #if 0
-    printf("NullExp::implicitConvTo(this=%s, type=%s, t=%s)\n",
-	toChars(), type->toChars(), t->toChars());
+    printf("NullExp::implicitConvTo(this=%s, type=%s, t=%s, committed = %d)\n",
+	toChars(), type->toChars(), t->toChars(), committed);
 #endif
     if (this->type->equals(t))
 	return MATCHexact;
--- a/dmd/constfold.c	Wed Oct 22 15:35:46 2008 +0200
+++ b/dmd/constfold.c	Wed Oct 22 17:06:17 2008 +0200
@@ -1297,6 +1297,8 @@
 {   Expression *e = EXP_CANT_INTERPRET;
     Loc loc = e1->loc;
     Type *t;
+    Type *t1 = e1->type->toBasetype();
+    Type *t2 = e2->type->toBasetype();
 
     //printf("Cat(e1 = %s, e2 = %s)\n", e1->toChars(), e2->toChars());
 
@@ -1442,6 +1444,31 @@
 	else
 	    e->type = type;
     }
+    else if (e1->op == TOKarrayliteral && e2->op == TOKnull &&
+	t1->nextOf()->equals(t2->nextOf()))
+    {
+	e = e1;
+	goto L3;
+    }
+    else if (e1->op == TOKnull && e2->op == TOKarrayliteral &&
+	t1->nextOf()->equals(t2->nextOf()))
+    {
+	e = e2;
+     L3:
+	// Concatenate the array with null
+	ArrayLiteralExp *es = (ArrayLiteralExp *)e;
+
+	es = new ArrayLiteralExp(es->loc, (Expressions *)es->elements->copy());
+	e = es;
+
+	if (type->toBasetype()->ty == Tsarray)
+	{
+	    e->type = new TypeSArray(t1->nextOf(), new IntegerExp(loc, es->elements->dim, Type::tindex));
+	    e->type = e->type->semantic(loc, NULL);
+	}
+	else
+	    e->type = type;
+    }
     else if ((e1->op == TOKarrayliteral || e1->op == TOKnull) &&
 	e1->type->toBasetype()->nextOf()->equals(e2->type))
     {
--- a/dmd/expression.c	Wed Oct 22 15:35:46 2008 +0200
+++ b/dmd/expression.c	Wed Oct 22 17:06:17 2008 +0200
@@ -4634,7 +4634,8 @@
     printf("BinExp::semantic('%s')\n", toChars());
 #endif
     e1 = e1->semantic(sc);
-    if (!e1->type)
+    if (!e1->type &&
+	!(op == TOKassign && e1->op == TOKdottd))	// a.template = e2
     {
 	error("%s has no value", e1->toChars());
 	e1->type = Type::terror;
@@ -4645,7 +4646,6 @@
 	error("%s has no value", e2->toChars());
 	e2->type = Type::terror;
     }
-    assert(e1->type);
     return this;
 }
 
@@ -7351,6 +7351,14 @@
     }
 
     BinExp::semantic(sc);
+
+    if (e1->op == TOKdottd)
+    {	// Rewrite a.b=e2, when b is a template, as a.b(e2)
+	Expression *e = new CallExp(loc, e1, e2);
+	e = e->semantic(sc);
+	return e;
+    }
+
     e2 = resolveProperties(sc, e2);
     assert(e1->type);
 
--- a/dmd/func.c	Wed Oct 22 15:35:46 2008 +0200
+++ b/dmd/func.c	Wed Oct 22 17:06:17 2008 +0200
@@ -1582,7 +1582,7 @@
 	m->anyf = f;
 	TypeFunction *tf = (TypeFunction *)f->type;
 	match = (MATCH) tf->callMatch(arguments);
-	//printf("match = %d\n", match);
+	//printf("1match = %d\n", match);
 	if (match != MATCHnomatch)
 	{
 	    if (match > m->last)
@@ -1658,7 +1658,7 @@
 		m->anyf = f;
 		tf = (TypeFunction *)f->type;
 		match = (MATCH) tf->callMatch(arguments);
-		//printf("match = %d\n", match);
+		//printf("2match = %d\n", match);
 		if (match != MATCHnomatch)
 		{
 		    if (match > m->last)
--- a/dmd/impcnvgen.c	Wed Oct 22 15:35:46 2008 +0200
+++ b/dmd/impcnvgen.c	Wed Oct 22 17:06:17 2008 +0200
@@ -344,6 +344,14 @@
     Y(Tint64, Tuns8)
     Y(Tuns64, Tuns8)
 
+    Y(Tint8, Tchar)
+    Y(Tint16, Tchar)
+    Y(Tuns16, Tchar)
+    Y(Tint32, Tchar)
+    Y(Tuns32, Tchar)
+    Y(Tint64, Tchar)
+    Y(Tuns64, Tchar)
+
     Y(Tuns16, Tint16)
     Y(Tint32, Tint16)
     Y(Tuns32, Tint16)
@@ -356,6 +364,12 @@
     Y(Tint64, Tuns16)
     Y(Tuns64, Tuns16)
 
+    Y(Tint16, Twchar)
+    Y(Tint32, Twchar)
+    Y(Tuns32, Twchar)
+    Y(Tint64, Twchar)
+    Y(Tuns64, Twchar)
+
 //    Y(Tuns32, Tint32)
     Y(Tint64, Tint32)
     Y(Tuns64, Tint32)
@@ -364,6 +378,9 @@
     Y(Tint64, Tuns32)
     Y(Tuns64, Tuns32)
 
+    Y(Tint64, Tdchar)
+    Y(Tuns64, Tdchar)
+
     Y(Tint64, Tuns64)
     Y(Tuns64, Tint64)
 
--- a/dmd/impcnvtab.c	Wed Oct 22 15:35:46 2008 +0200
+++ b/dmd/impcnvtab.c	Wed Oct 22 17:06:17 2008 +0200
@@ -148,14 +148,14 @@
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
--- a/dmd/lexer.c	Wed Oct 22 15:35:46 2008 +0200
+++ b/dmd/lexer.c	Wed Oct 22 17:06:17 2008 +0200
@@ -394,6 +394,15 @@
     return t;
 }
 
+/***********************
+ * Look ahead at next token's value.
+ */
+
+TOK Lexer::peekNext()
+{
+    return peek(&token)->value;
+}
+
 /*********************************
  * tk is on the opening (.
  * Look ahead and return token that is past the closing ).
--- a/dmd/lexer.h	Wed Oct 22 15:35:46 2008 +0200
+++ b/dmd/lexer.h	Wed Oct 22 17:06:17 2008 +0200
@@ -1,306 +1,307 @@
-
-// Compiler implementation of the D programming language
-// Copyright (c) 1999-2008 by Digital Mars
-// All Rights Reserved
-// written by Walter Bright
-// http://www.digitalmars.com
-// License for redistribution is by either the Artistic License
-// in artistic.txt, or the GNU General Public License in gnu.txt.
-// See the included readme.txt for details.
-
-#ifndef DMD_LEXER_H
-#define DMD_LEXER_H
-
-#ifdef __DMC__
-#pragma once
-#endif /* __DMC__ */
-
-#include "root.h"
-#include "mars.h"
-
-struct StringTable;
-struct Identifier;
-struct Module;
-
-/* Tokens:
-	(	)
-	[	]
-	{	}
-	<	>	<=	>=	==	!=	===	!==
-	<<	>>	<<=	>>=	>>>	>>>=
-	+	-	+=	-=
-	*	/	%	*=	/=	%=
-	&	| 	^	&=	|=	^=
-	=	!	~
-	++	--
-	.	->	:	,
-	?	&&	||
- */
-
-enum TOK
-{
-	TOKreserved,
-
-	// Other
-	TOKlparen,	TOKrparen,
-	TOKlbracket,	TOKrbracket,
-	TOKlcurly,	TOKrcurly,
-	TOKcolon,	TOKneg,
-	TOKsemicolon,	TOKdotdotdot,
-	TOKeof,		TOKcast,
-	TOKnull,	TOKassert,
-	TOKtrue,	TOKfalse,
-	TOKarray,	TOKcall,
-	TOKaddress,	TOKtypedot,
-	TOKtype,	TOKthrow,
-	TOKnew,		TOKdelete,
-	TOKstar,	TOKsymoff,
-	TOKvar,		TOKdotvar,
-	TOKdotti,	TOKdotexp,
-	TOKdottype,	TOKslice,
-	TOKarraylength,	TOKversion,
-	TOKmodule,	TOKdollar,
-	TOKtemplate,	TOKdottd,
-	TOKdeclaration,	TOKtypeof,
-	TOKpragma,	TOKdsymbol,
-	TOKtypeid,	TOKuadd,
-	TOKremove,
-	TOKnewanonclass, TOKcomment,
-	TOKarrayliteral, TOKassocarrayliteral,
-	TOKstructliteral,
-
-	// Operators
-	TOKlt,		TOKgt,
-	TOKle,		TOKge,
-	TOKequal,	TOKnotequal,
-	TOKidentity,	TOKnotidentity,
-	TOKindex,	TOKis,
-	TOKtobool,
-
-// 60
-	// NCEG floating point compares
-	// !<>=     <>    <>=    !>     !>=   !<     !<=   !<>
-	TOKunord,TOKlg,TOKleg,TOKule,TOKul,TOKuge,TOKug,TOKue,
-
-	TOKshl,		TOKshr,
-	TOKshlass,	TOKshrass,
-	TOKushr,	TOKushrass,
-	TOKcat,		TOKcatass,	// ~ ~=
-	TOKadd,		TOKmin,		TOKaddass,	TOKminass,
-	TOKmul,		TOKdiv,		TOKmod,
-	TOKmulass,	TOKdivass,	TOKmodass,
-	TOKand,		TOKor,		TOKxor,
-	TOKandass,	TOKorass,	TOKxorass,
-	TOKassign,	TOKnot,		TOKtilde,
-	TOKplusplus,	TOKminusminus,	TOKconstruct,	TOKblit,
-	TOKdot,		TOKarrow,	TOKcomma,
-	TOKquestion,	TOKandand,	TOKoror,
-
-// 104
-	// Numeric literals
-	TOKint32v, TOKuns32v,
-	TOKint64v, TOKuns64v,
-	TOKfloat32v, TOKfloat64v, TOKfloat80v,
-	TOKimaginary32v, TOKimaginary64v, TOKimaginary80v,
-
-	// Char constants
-	TOKcharv, TOKwcharv, TOKdcharv,
-
-	// Leaf operators
-	TOKidentifier,	TOKstring,
-	TOKthis,	TOKsuper,
-	TOKhalt,	TOKtuple,
-
-	// Basic types
-	TOKvoid,
-	TOKint8, TOKuns8,
-	TOKint16, TOKuns16,
-	TOKint32, TOKuns32,
-	TOKint64, TOKuns64,
-	TOKfloat32, TOKfloat64, TOKfloat80,
-	TOKimaginary32, TOKimaginary64, TOKimaginary80,
-	TOKcomplex32, TOKcomplex64, TOKcomplex80,
-	TOKchar, TOKwchar, TOKdchar, TOKbit, TOKbool,
-	TOKcent, TOKucent,
-
-	// Aggregates
-	TOKstruct, TOKclass, TOKinterface, TOKunion, TOKenum, TOKimport,
-	TOKtypedef, TOKalias, TOKoverride, TOKdelegate, TOKfunction,
-	TOKmixin,
-
-	TOKalign, TOKextern, TOKprivate, TOKprotected, TOKpublic, TOKexport,
-	TOKstatic, /*TOKvirtual,*/ TOKfinal, TOKconst, TOKabstract, TOKvolatile,
-	TOKdebug, TOKdeprecated, TOKin, TOKout, TOKinout, TOKlazy,
-	TOKauto, TOKpackage, TOKmanifest,
-
-	// Statements
-	TOKif, TOKelse, TOKwhile, TOKfor, TOKdo, TOKswitch,
-	TOKcase, TOKdefault, TOKbreak, TOKcontinue, TOKwith,
-	TOKsynchronized, TOKreturn, TOKgoto, TOKtry, TOKcatch, TOKfinally,
-	TOKasm, TOKforeach, TOKforeach_reverse,
-	TOKscope,
-	TOKon_scope_exit, TOKon_scope_failure, TOKon_scope_success,
-
-	// Contracts
-	TOKbody, TOKinvariant,
-
-	// Testing
-	TOKunittest,
-
-	// Added after 1.0
-	TOKref,
-	TOKmacro,
-#if DMDV2
-	TOKtraits,
-	TOKoverloadset,
-	TOKpure,
-	TOKnothrow,
-	TOKtls,
-	TOKline,
-	TOKfile,
-    TOKshared,
-#endif
-
-// LDC specific
-#if IN_LLVM
-    TOKgep,
-#endif
-
-	TOKMAX
-};
-
-#define CASE_BASIC_TYPES			\
-	case TOKwchar: case TOKdchar:		\
-	case TOKbit: case TOKbool: case TOKchar:	\
-	case TOKint8: case TOKuns8:		\
-	case TOKint16: case TOKuns16:		\
-	case TOKint32: case TOKuns32:		\
-	case TOKint64: case TOKuns64:		\
-	case TOKfloat32: case TOKfloat64: case TOKfloat80:		\
-	case TOKimaginary32: case TOKimaginary64: case TOKimaginary80:	\
-	case TOKcomplex32: case TOKcomplex64: case TOKcomplex80:	\
-	case TOKvoid
-
-#define CASE_BASIC_TYPES_X(t)					\
-	case TOKvoid:	 t = Type::tvoid;  goto LabelX;		\
-	case TOKint8:	 t = Type::tint8;  goto LabelX;		\
-	case TOKuns8:	 t = Type::tuns8;  goto LabelX;		\
-	case TOKint16:	 t = Type::tint16; goto LabelX;		\
-	case TOKuns16:	 t = Type::tuns16; goto LabelX;		\
-	case TOKint32:	 t = Type::tint32; goto LabelX;		\
-	case TOKuns32:	 t = Type::tuns32; goto LabelX;		\
-	case TOKint64:	 t = Type::tint64; goto LabelX;		\
-	case TOKuns64:	 t = Type::tuns64; goto LabelX;		\
-	case TOKfloat32: t = Type::tfloat32; goto LabelX;	\
-	case TOKfloat64: t = Type::tfloat64; goto LabelX;	\
-	case TOKfloat80: t = Type::tfloat80; goto LabelX;	\
-	case TOKimaginary32: t = Type::timaginary32; goto LabelX;	\
-	case TOKimaginary64: t = Type::timaginary64; goto LabelX;	\
-	case TOKimaginary80: t = Type::timaginary80; goto LabelX;	\
-	case TOKcomplex32: t = Type::tcomplex32; goto LabelX;	\
-	case TOKcomplex64: t = Type::tcomplex64; goto LabelX;	\
-	case TOKcomplex80: t = Type::tcomplex80; goto LabelX;	\
-	case TOKbit:	 t = Type::tbit;     goto LabelX;	\
-	case TOKbool:	 t = Type::tbool;    goto LabelX;	\
-	case TOKchar:	 t = Type::tchar;    goto LabelX;	\
-	case TOKwchar:	 t = Type::twchar; goto LabelX;	\
-	case TOKdchar:	 t = Type::tdchar; goto LabelX;	\
-	LabelX
-
-struct Token
-{
-    Token *next;
-    unsigned char *ptr;		// pointer to first character of this token within buffer
-    enum TOK value;
-    unsigned char *blockComment; // doc comment string prior to this token
-    unsigned char *lineComment;	 // doc comment for previous token
-    union
-    {
-	// Integers
-	d_int32 int32value;
-	d_uns32	uns32value;
-	d_int64	int64value;
-	d_uns64	uns64value;
-
-	// Floats
-#ifdef IN_GCC
-	// real_t float80value; // can't use this in a union!
-#else
-	d_float80 float80value;
-#endif
-
-	struct
-	{   unsigned char *ustring;	// UTF8 string
-	    unsigned len;
-	    unsigned char postfix;	// 'c', 'w', 'd'
-	};
-
-	Identifier *ident;
-    };
-#ifdef IN_GCC
-    real_t float80value; // can't use this in a union!
-#endif
-
-    static const char *tochars[TOKMAX];
-    static void *operator new(size_t sz);
-
-    int isKeyword();
-    void print();
-    const char *toChars();
-    static const char *toChars(enum TOK);
-};
-
-struct Lexer
-{
-    static StringTable stringtable;
-    static OutBuffer stringbuffer;
-    static Token *freelist;
-
-    Loc loc;			// for error messages
-
-    unsigned char *base;	// pointer to start of buffer
-    unsigned char *end;		// past end of buffer
-    unsigned char *p;		// current character
-    Token token;
-    Module *mod;
-    int doDocComment;		// collect doc comment information
-    int anyToken;		// !=0 means seen at least one token
-    int commentToken;		// !=0 means comments are TOKcomment's
-
-    Lexer(Module *mod,
-	unsigned char *base, unsigned begoffset, unsigned endoffset,
-	int doDocComment, int commentToken);
-
-    static void initKeywords();
-    static Identifier *idPool(const char *s);
-    static Identifier *uniqueId(const char *s);
-    static Identifier *uniqueId(const char *s, int num);
-
-    TOK nextToken();
-    void scan(Token *t);
-    Token *peek(Token *t);
-    Token *peekPastParen(Token *t);
-    unsigned escapeSequence();
-    TOK wysiwygStringConstant(Token *t, int tc);
-    TOK hexStringConstant(Token *t);
-#if DMDV2
-    TOK delimitedStringConstant(Token *t);
-    TOK tokenStringConstant(Token *t);
-#endif
-    TOK escapeStringConstant(Token *t, int wide);
-    TOK charConstant(Token *t, int wide);
-    void stringPostfix(Token *t);
-    unsigned wchar(unsigned u);
-    TOK number(Token *t);
-    TOK inreal(Token *t);
-    void error(const char *format, ...);
-    void error(Loc loc, const char *format, ...);
-    void pragma();
-    unsigned decodeUTF();
-    void getDocComment(Token *t, unsigned lineComment);
-
-    static int isValidIdentifier(char *p);
-    static unsigned char *combineComments(unsigned char *c1, unsigned char *c2);
-};
-
-#endif /* DMD_LEXER_H */
+
+// Compiler implementation of the D programming language
+// Copyright (c) 1999-2008 by Digital Mars
+// All Rights Reserved
+// written by Walter Bright
+// http://www.digitalmars.com
+// License for redistribution is by either the Artistic License
+// in artistic.txt, or the GNU General Public License in gnu.txt.
+// See the included readme.txt for details.
+
+#ifndef DMD_LEXER_H
+#define DMD_LEXER_H
+
+#ifdef __DMC__
+#pragma once
+#endif /* __DMC__ */
+
+#include "root.h"
+#include "mars.h"
+
+struct StringTable;
+struct Identifier;
+struct Module;
+
+/* Tokens:
+	(	)
+	[	]
+	{	}
+	<	>	<=	>=	==	!=	===	!==
+	<<	>>	<<=	>>=	>>>	>>>=
+	+	-	+=	-=
+	*	/	%	*=	/=	%=
+	&	| 	^	&=	|=	^=
+	=	!	~
+	++	--
+	.	->	:	,
+	?	&&	||
+ */
+
+enum TOK
+{
+	TOKreserved,
+
+	// Other
+	TOKlparen,	TOKrparen,
+	TOKlbracket,	TOKrbracket,
+	TOKlcurly,	TOKrcurly,
+	TOKcolon,	TOKneg,
+	TOKsemicolon,	TOKdotdotdot,
+	TOKeof,		TOKcast,
+	TOKnull,	TOKassert,
+	TOKtrue,	TOKfalse,
+	TOKarray,	TOKcall,
+	TOKaddress,	TOKtypedot,
+	TOKtype,	TOKthrow,
+	TOKnew,		TOKdelete,
+	TOKstar,	TOKsymoff,
+	TOKvar,		TOKdotvar,
+	TOKdotti,	TOKdotexp,
+	TOKdottype,	TOKslice,
+	TOKarraylength,	TOKversion,
+	TOKmodule,	TOKdollar,
+	TOKtemplate,	TOKdottd,
+	TOKdeclaration,	TOKtypeof,
+	TOKpragma,	TOKdsymbol,
+	TOKtypeid,	TOKuadd,
+	TOKremove,
+	TOKnewanonclass, TOKcomment,
+	TOKarrayliteral, TOKassocarrayliteral,
+	TOKstructliteral,
+
+	// Operators
+	TOKlt,		TOKgt,
+	TOKle,		TOKge,
+	TOKequal,	TOKnotequal,
+	TOKidentity,	TOKnotidentity,
+	TOKindex,	TOKis,
+	TOKtobool,
+
+// 60
+	// NCEG floating point compares
+	// !<>=     <>    <>=    !>     !>=   !<     !<=   !<>
+	TOKunord,TOKlg,TOKleg,TOKule,TOKul,TOKuge,TOKug,TOKue,
+
+	TOKshl,		TOKshr,
+	TOKshlass,	TOKshrass,
+	TOKushr,	TOKushrass,
+	TOKcat,		TOKcatass,	// ~ ~=
+	TOKadd,		TOKmin,		TOKaddass,	TOKminass,
+	TOKmul,		TOKdiv,		TOKmod,
+	TOKmulass,	TOKdivass,	TOKmodass,
+	TOKand,		TOKor,		TOKxor,
+	TOKandass,	TOKorass,	TOKxorass,
+	TOKassign,	TOKnot,		TOKtilde,
+	TOKplusplus,	TOKminusminus,	TOKconstruct,	TOKblit,
+	TOKdot,		TOKarrow,	TOKcomma,
+	TOKquestion,	TOKandand,	TOKoror,
+
+// 104
+	// Numeric literals
+	TOKint32v, TOKuns32v,
+	TOKint64v, TOKuns64v,
+	TOKfloat32v, TOKfloat64v, TOKfloat80v,
+	TOKimaginary32v, TOKimaginary64v, TOKimaginary80v,
+
+	// Char constants
+	TOKcharv, TOKwcharv, TOKdcharv,
+
+	// Leaf operators
+	TOKidentifier,	TOKstring,
+	TOKthis,	TOKsuper,
+	TOKhalt,	TOKtuple,
+
+	// Basic types
+	TOKvoid,
+	TOKint8, TOKuns8,
+	TOKint16, TOKuns16,
+	TOKint32, TOKuns32,
+	TOKint64, TOKuns64,
+	TOKfloat32, TOKfloat64, TOKfloat80,
+	TOKimaginary32, TOKimaginary64, TOKimaginary80,
+	TOKcomplex32, TOKcomplex64, TOKcomplex80,
+	TOKchar, TOKwchar, TOKdchar, TOKbit, TOKbool,
+	TOKcent, TOKucent,
+
+	// Aggregates
+	TOKstruct, TOKclass, TOKinterface, TOKunion, TOKenum, TOKimport,
+	TOKtypedef, TOKalias, TOKoverride, TOKdelegate, TOKfunction,
+	TOKmixin,
+
+	TOKalign, TOKextern, TOKprivate, TOKprotected, TOKpublic, TOKexport,
+	TOKstatic, /*TOKvirtual,*/ TOKfinal, TOKconst, TOKabstract, TOKvolatile,
+	TOKdebug, TOKdeprecated, TOKin, TOKout, TOKinout, TOKlazy,
+	TOKauto, TOKpackage, TOKmanifest,
+
+	// Statements
+	TOKif, TOKelse, TOKwhile, TOKfor, TOKdo, TOKswitch,
+	TOKcase, TOKdefault, TOKbreak, TOKcontinue, TOKwith,
+	TOKsynchronized, TOKreturn, TOKgoto, TOKtry, TOKcatch, TOKfinally,
+	TOKasm, TOKforeach, TOKforeach_reverse,
+	TOKscope,
+	TOKon_scope_exit, TOKon_scope_failure, TOKon_scope_success,
+
+	// Contracts
+	TOKbody, TOKinvariant,
+
+	// Testing
+	TOKunittest,
+
+	// Added after 1.0
+	TOKref,
+	TOKmacro,
+#if DMDV2
+	TOKtraits,
+	TOKoverloadset,
+	TOKpure,
+	TOKnothrow,
+	TOKtls,
+	TOKline,
+	TOKfile,
+    TOKshared,
+#endif
+
+// LDC specific
+#if IN_LLVM
+    TOKgep,
+#endif
+
+	TOKMAX
+};
+
+#define CASE_BASIC_TYPES			\
+	case TOKwchar: case TOKdchar:		\
+	case TOKbit: case TOKbool: case TOKchar:	\
+	case TOKint8: case TOKuns8:		\
+	case TOKint16: case TOKuns16:		\
+	case TOKint32: case TOKuns32:		\
+	case TOKint64: case TOKuns64:		\
+	case TOKfloat32: case TOKfloat64: case TOKfloat80:		\
+	case TOKimaginary32: case TOKimaginary64: case TOKimaginary80:	\
+	case TOKcomplex32: case TOKcomplex64: case TOKcomplex80:	\
+	case TOKvoid
+
+#define CASE_BASIC_TYPES_X(t)					\
+	case TOKvoid:	 t = Type::tvoid;  goto LabelX;		\
+	case TOKint8:	 t = Type::tint8;  goto LabelX;		\
+	case TOKuns8:	 t = Type::tuns8;  goto LabelX;		\
+	case TOKint16:	 t = Type::tint16; goto LabelX;		\
+	case TOKuns16:	 t = Type::tuns16; goto LabelX;		\
+	case TOKint32:	 t = Type::tint32; goto LabelX;		\
+	case TOKuns32:	 t = Type::tuns32; goto LabelX;		\
+	case TOKint64:	 t = Type::tint64; goto LabelX;		\
+	case TOKuns64:	 t = Type::tuns64; goto LabelX;		\
+	case TOKfloat32: t = Type::tfloat32; goto LabelX;	\
+	case TOKfloat64: t = Type::tfloat64; goto LabelX;	\
+	case TOKfloat80: t = Type::tfloat80; goto LabelX;	\
+	case TOKimaginary32: t = Type::timaginary32; goto LabelX;	\
+	case TOKimaginary64: t = Type::timaginary64; goto LabelX;	\
+	case TOKimaginary80: t = Type::timaginary80; goto LabelX;	\
+	case TOKcomplex32: t = Type::tcomplex32; goto LabelX;	\
+	case TOKcomplex64: t = Type::tcomplex64; goto LabelX;	\
+	case TOKcomplex80: t = Type::tcomplex80; goto LabelX;	\
+	case TOKbit:	 t = Type::tbit;     goto LabelX;	\
+	case TOKbool:	 t = Type::tbool;    goto LabelX;	\
+	case TOKchar:	 t = Type::tchar;    goto LabelX;	\
+	case TOKwchar:	 t = Type::twchar; goto LabelX;	\
+	case TOKdchar:	 t = Type::tdchar; goto LabelX;	\
+	LabelX
+
+struct Token
+{
+    Token *next;
+    unsigned char *ptr;		// pointer to first character of this token within buffer
+    enum TOK value;
+    unsigned char *blockComment; // doc comment string prior to this token
+    unsigned char *lineComment;	 // doc comment for previous token
+    union
+    {
+	// Integers
+	d_int32 int32value;
+	d_uns32	uns32value;
+	d_int64	int64value;
+	d_uns64	uns64value;
+
+	// Floats
+#ifdef IN_GCC
+	// real_t float80value; // can't use this in a union!
+#else
+	d_float80 float80value;
+#endif
+
+	struct
+	{   unsigned char *ustring;	// UTF8 string
+	    unsigned len;
+	    unsigned char postfix;	// 'c', 'w', 'd'
+	};
+
+	Identifier *ident;
+    };
+#ifdef IN_GCC
+    real_t float80value; // can't use this in a union!
+#endif
+
+    static const char *tochars[TOKMAX];
+    static void *operator new(size_t sz);
+
+    int isKeyword();
+    void print();
+    const char *toChars();
+    static const char *toChars(enum TOK);
+};
+
+struct Lexer
+{
+    static StringTable stringtable;
+    static OutBuffer stringbuffer;
+    static Token *freelist;
+
+    Loc loc;			// for error messages
+
+    unsigned char *base;	// pointer to start of buffer
+    unsigned char *end;		// past end of buffer
+    unsigned char *p;		// current character
+    Token token;
+    Module *mod;
+    int doDocComment;		// collect doc comment information
+    int anyToken;		// !=0 means seen at least one token
+    int commentToken;		// !=0 means comments are TOKcomment's
+
+    Lexer(Module *mod,
+	unsigned char *base, unsigned begoffset, unsigned endoffset,
+	int doDocComment, int commentToken);
+
+    static void initKeywords();
+    static Identifier *idPool(const char *s);
+    static Identifier *uniqueId(const char *s);
+    static Identifier *uniqueId(const char *s, int num);
+
+    TOK nextToken();
+    TOK peekNext();
+    void scan(Token *t);
+    Token *peek(Token *t);
+    Token *peekPastParen(Token *t);
+    unsigned escapeSequence();
+    TOK wysiwygStringConstant(Token *t, int tc);
+    TOK hexStringConstant(Token *t);
+#if DMDV2
+    TOK delimitedStringConstant(Token *t);
+    TOK tokenStringConstant(Token *t);
+#endif
+    TOK escapeStringConstant(Token *t, int wide);
+    TOK charConstant(Token *t, int wide);
+    void stringPostfix(Token *t);
+    unsigned wchar(unsigned u);
+    TOK number(Token *t);
+    TOK inreal(Token *t);
+    void error(const char *format, ...);
+    void error(Loc loc, const char *format, ...);
+    void pragma();
+    unsigned decodeUTF();
+    void getDocComment(Token *t, unsigned lineComment);
+
+    static int isValidIdentifier(char *p);
+    static unsigned char *combineComments(unsigned char *c1, unsigned char *c2);
+};
+
+#endif /* DMD_LEXER_H */
--- a/dmd/mars.c	Wed Oct 22 15:35:46 2008 +0200
+++ b/dmd/mars.c	Wed Oct 22 17:06:17 2008 +0200
@@ -62,7 +62,7 @@
 
     copyright = "Copyright (c) 1999-2008 by Digital Mars and Tomas Lindquist Olsen";
     written = "written by Walter Bright and Tomas Lindquist Olsen";
-    version = "v1.035";
+    version = "v1.036";
     ldc_version = "0.1";
     global.structalign = 8;
 
--- a/dmd/mtype.c	Wed Oct 22 15:35:46 2008 +0200
+++ b/dmd/mtype.c	Wed Oct 22 17:06:17 2008 +0200
@@ -4373,7 +4373,7 @@
     s = s->toAlias();
 
     v = s->isVarDeclaration();
-    if (v && v->isConst())
+    if (v && v->isConst() && v->type->toBasetype()->ty != Tsarray)
     {	ExpInitializer *ei = v->getExpInitializer();
 
 	if (ei)
@@ -4781,7 +4781,7 @@
 	s->checkDeprecated(e->loc, sc);
     s = s->toAlias();
     v = s->isVarDeclaration();
-    if (v && v->isConst())
+    if (v && v->isConst() && v->type->toBasetype()->ty != Tsarray)
     {	ExpInitializer *ei = v->getExpInitializer();
 
 	if (ei)
--- a/dmd/parse.c	Wed Oct 22 15:35:46 2008 +0200
+++ b/dmd/parse.c	Wed Oct 22 17:06:17 2008 +0200
@@ -3570,7 +3570,7 @@
 	switch (t->value)
 	{
 	    case TOKmul:
-	    case TOKand:
+	    //case TOKand:
 		t = peek(t);
 		continue;
 
--- a/runtime/internal/aaA.d	Wed Oct 22 15:35:46 2008 +0200
+++ b/runtime/internal/aaA.d	Wed Oct 22 17:06:17 2008 +0200
@@ -440,6 +440,8 @@
 
 /********************************************
  * Produce array of values from aa.
+ * The actual type is painted on the return value by the frontend
+ * This means the returned length should be the number of elements
  */
 
 void[] _aaValues(AA aa, size_t keysize, size_t valuesize)
@@ -585,6 +587,8 @@
 
 /********************************************
  * Produce array of N byte keys from aa.
+ * The actual type is painted on the return value by the frontend
+ * This means the returned length should be the number of elements
  */
 
 void[] _aaKeys(AA aa, size_t keysize)
--- a/runtime/internal/adi.d	Wed Oct 22 15:35:46 2008 +0200
+++ b/runtime/internal/adi.d	Wed Oct 22 17:06:17 2008 +0200
@@ -240,6 +240,8 @@
 
 /**********************************************
  * Support for array.reverse property.
+ * The actual type is painted on the return value by the frontend
+ * Given and returned length are number of elements
  */
 
 extern (C) void[] _adReverse(void[] a, size_t szelem)
@@ -370,6 +372,8 @@
 
 /***************************************
  * Support for array equality test.
+ * The actual type is painted on the return value by the frontend
+ * Given lengths are number of elements
  */
 
 extern (C) int _adEq(void[] a1, void[] a2, TypeInfo ti)
@@ -400,6 +404,8 @@
 
 /***************************************
  * Support for array compare test.
+ * The actual type is painted on the return value by the frontend
+ * Given lengths are number of elements
  */
 
 extern (C) int _adCmp(void[] a1, void[] a2, TypeInfo ti)
@@ -437,6 +443,8 @@
 
 /***************************************
  * Support for array compare test.
+ * The actual type is painted on the return value by the frontend
+ * Given lengths are number of elements
  */
 
 extern (C) int _adCmpChar(void[] a1, void[] a2)
--- a/runtime/internal/lifetime.d	Wed Oct 22 15:35:46 2008 +0200
+++ b/runtime/internal/lifetime.d	Wed Oct 22 17:06:17 2008 +0200
@@ -1091,6 +1091,9 @@
 
 /**
  * Support for array.dup property.
+ * The actual type is painted on the return value by the frontend
+ * Given length is number of elements
+ * Returned length is number of elements
  */