diff --git a/ghc/compiler/parser/hslexer.flex b/ghc/compiler/parser/hslexer.flex
index a5adef34eadcd7e2987821711b6b6013e5d8876d..fc1b66b5ca7fd898bfbae43ef306c11f9df8c4d1 100644
--- a/ghc/compiler/parser/hslexer.flex
+++ b/ghc/compiler/parser/hslexer.flex
@@ -401,6 +401,7 @@ NL  	    	    	[\n\r]
 <GlaExt>"_casm_GC_"		{ RETURN(CASM_GC); }
 <GlaExt>"foreign"		{ RETURN(FOREIGN); }
 <GlaExt>"export"		{ RETURN(EXPORT); }
+<GlaExt>"label"			{ RETURN(LABEL); }
 <GlaExt>"unsafe"		{ RETURN(UNSAFE); }
 <GlaExt>"_stdcall"		{ RETURN(STDCALL); }
 <GlaExt>"_ccall"		{ RETURN(C_CALL); }
diff --git a/ghc/compiler/parser/hsparser.y b/ghc/compiler/parser/hsparser.y
index 59d6f9d9ad64bd4868c7f8c3ff55210a2708cf1f..8a691fdcaf37e65d69af2c308ea92af6713c4bab 100644
--- a/ghc/compiler/parser/hsparser.y
+++ b/ghc/compiler/parser/hsparser.y
@@ -161,7 +161,7 @@ BOOLEAN pat_check=TRUE;
 
 %token  SCC
 %token	CCALL		CCALL_GC	CASM		CASM_GC
-%token  EXPORT          UNSAFE          STDCALL		C_CALL  
+%token  EXPORT          UNSAFE          STDCALL		C_CALL   LABEL
 %token  PASCAL		FASTCALL	FOREIGN         DYNAMIC
 
 /**********************************************************************
@@ -548,6 +548,8 @@ defaultd:  defaultkey OPAREN types CPAREN       { $$ = mkdbind($3,startlineno);
 foreignd:  foreignkey IMPORT callconv ext_name unsafe_flag qvarid DCOLON sigtype { $$ = mkfobind($6,$8,$4,$5,$3,FOREIGN_IMPORT,startlineno); }
         |  foreignkey EXPORT callconv ext_name qvarid DCOLON sigtype             { $$ = mkfobind($5,$7,$4,0,$3,FOREIGN_EXPORT,startlineno); }
 	;
+        |  foreignkey LABEL ext_name qvarid DCOLON sigtype                       { $$ = mkfobind($4,$6,$3,0,-1,FOREIGN_LABEL,startlineno); }
+	;
 
 callconv: STDCALL 	{ $$ = CALLCONV_STDCALL;  }
 	| C_CALL        { $$ = CALLCONV_CCALL;    }
diff --git a/ghc/compiler/parser/utils.h b/ghc/compiler/parser/utils.h
index 8124440038e4499aacfa983a262fd95196eee101..4ebf921a538e10f30829e5a8fbe538ea243a7861 100644
--- a/ghc/compiler/parser/utils.h
+++ b/ghc/compiler/parser/utils.h
@@ -122,6 +122,7 @@ void	checkprec PROTO((tree, qid, BOOLEAN));
 
 #define FOREIGN_IMPORT    0
 #define FOREIGN_EXPORT    1
+#define FOREIGN_LABEL     2
 
 BOOLEAN	isconstr PROTO((char *));
 void	setstartlineno PROTO((void));