Index: src/fortranscanner.l
===================================================================
--- src/fortranscanner.l	(revision 749)
+++ src/fortranscanner.l	(working copy)
@@ -86,11 +86,15 @@
   bool pointer;
   bool target;
   bool save;
+  bool nopass;
+  bool pass;
+  QCString passVar;
 
   SymbolModifiers() : type(), returnName(), protection(NONE_P), direction(NONE_D),
     optional(FALSE), dimension(), allocatable(FALSE),
     external(FALSE), intrinsic(FALSE), parameter(FALSE),
-    pointer(FALSE), target(FALSE), save(FALSE) {}
+    pointer(FALSE), target(FALSE), save(FALSE),
+    nopass(FALSE), pass(FALSE), passVar() {}
 
   SymbolModifiers& operator|=(const SymbolModifiers &mdfs);
   SymbolModifiers& operator|=(QCString mdfrString);
@@ -220,10 +224,10 @@
 NUM_TYPE  (complex|integer|logical|real)
 KIND      {ARGS}
 CHAR      (CHARACTER{ARGS}?|CHARACTER{BS}"*"({BS}[0-9]+|{ARGS}))
-TYPE_SPEC (({NUM_TYPE}({BS}"*"{BS}[0-9]+)?)|({NUM_TYPE}{KIND})|DOUBLE{BS_}PRECISION|{CHAR}|TYPE{ARGS})
+TYPE_SPEC (({NUM_TYPE}({BS}"*"{BS}[0-9]+)?)|({NUM_TYPE}{KIND})|DOUBLE{BS_}PRECISION|{CHAR}|TYPE{ARGS}|PROCEDURE{ARGS})
 
 INTENT_SPEC intent{BS}"("{BS}(in|out|in{BS}out){BS}")"
-ATTR_SPEC (ALLOCATABLE|DIMENSION{ARGS}|EXTERNAL|{INTENT_SPEC}|INTRINSIC|OPTIONAL|PARAMETER|POINTER|PRIVATE|PUBLIC|SAVE|TARGET)
+ATTR_SPEC (ALLOCATABLE|DIMENSION{ARGS}|EXTERNAL|{INTENT_SPEC}|INTRINSIC|OPTIONAL|PARAMETER|POINTER|PRIVATE|PUBLIC|SAVE|TARGET|NOPASS|PASS{ARGS})
 ACCESS_SPEC (PRIVATE|PUBLIC)
 /* Assume that attribute statements are almost the same as attributes. */
 ATTR_STMT {ATTR_SPEC}|DIMENSION|{ACCESS_SPEC}
@@ -1168,6 +1169,9 @@
   pointer |= mdfs.pointer;
   target |= mdfs.target;
   save |= mdfs.save;
+  nopass |= mdfs.nopass;
+  pass |= mdfs.pass;
+  passVar = mdfs.passVar;
   return *this;
 }
 
@@ -1230,6 +1234,15 @@
   {
     newMdf.save = TRUE;
   }
+  else if (mdfString=="nopass")
+  {
+    newMdf.nopass = TRUE;
+  }
+  else if (mdfString.contains("pass"))
+  {
+    newMdf.pass = TRUE;
+    newMdf.passVar = extractFromParens(mdfString);
+  }
 
   (*this) |= newMdf;
   return *this;
@@ -1336,6 +1349,16 @@
     typeName += ",";
     typeName += "save";
   }
+  if (mdfs.nopass) 
+  {
+    typeName += ",";
+    typeName += "nopass";
+  }
+  if (mdfs.pass) 
+  {
+    typeName += ",";
+    typeName += "pass(" + mdfs.passVar + ")";
+  }
   if (mdfs.protection == SymbolModifiers::PUBLIC)
   {
     typeName += ",";
