[ \t]*\\(\\(?:\\sw\\|\\s_\\)+\\)"
"Regexp matching the definition of a derived type.")
+;; Maybe this should include "class default", but the constant is no
+;; longer used.
(defconst f90-typeis-re
"\\_<\\(class\\|type\\)[ \t]*is[ \t]*("
"Regexp matching a CLASS/TYPE IS statement.")
;; Avoid F2003 "type is" in "select type",
;; and also variables of derived type "type (foo)".
;; "type, foo" must be a block (?).
+ ;; And a partial effort to avoid "class default".
"\\(?:type\\|class\\)[ \t,]\\("
- "[^i(!\n\"& \t]\\|" ; not-i(
+ "[^id(!\n\"& \t]\\|" ; not-id(
"i[^s!\n\"& \t]\\|" ; i not-s
- "is\\(?:\\sw\\|\\s_\\)\\)\\|"
+ "d[^e!\n\"& \t]\\|" ; d not-e
+ "de[^f!\n\"& \t]\\|" ; de not-f
+ "def[^a!\n\"& \t]\\|" ; def not-a
+ "\\(?:is\\|default\\)\\(?:\\sw\\|\\s_\\)\\)\\|"
;; "abstract interface" is F2003; "submodule" is F2008.
"program\\|\\(?:abstract[ \t]*\\)?interface\\|\\(?:sub\\)?module\\|"
;; "enum", but not "enumerator".
(not (or (looking-at "end")
(looking-at "\\(do\\|if\\|else\\(if\\|where\\)?\
\\|select[ \t]*\\(case\\|type\\)\\|case\\|where\\|forall\\|\
-\\(?:class\\|type\\)[ \t]*is\\|\
+\\(?:class\\|type\\)[ \t]*is\\|class[ \t]*default\\|\
block\\|critical\\|enum\\|associate\\)\\_>")
(looking-at "\\(program\\|\\(?:sub\\)?module\\|\
\\(?:abstract[ \t]*\\)?interface\\|block[ \t]*data\\)\\_>")
(should (= 5 (current-indentation)))))
(ert-deftest f90-test-bug25039 ()
- "Test for https://debbugs.gnu.org/25039 ."
+ "Test for https://debbugs.gnu.org/25039 and 28786."
(with-temp-buffer
(f90-mode)
(insert "program prog
select type (a)
-class is (c1)
-x = 1
type is (t1)
x = 2
+class is (c1)
+x = 1
+class default
+x=3
end select
end program prog")
(f90-indent-subprogram)
(forward-line -3)
- (should (= 2 (current-indentation))) ; type is
+ (should (= 2 (current-indentation))) ; class default
+ (forward-line -2)
+ (should (= 2 (current-indentation))) ; class is
(forward-line -2)
- (should (= 2 (current-indentation))))) ; class is
+ (should (= 2 (current-indentation))))) ; type is
;;; f90-tests.el ends here