Merge
authorlana
Thu, 13 Aug 2015 14:14:59 -0700
changeset 32165 5841c9337554
parent 32162 03c62c0b71ce (current diff)
parent 32164 6c65d5b414bc (diff)
child 32166 b98903c1604c
Merge
langtools/test/tools/javac/lambda/T8024809/SelfInitializerInLambdaTesta.java
langtools/test/tools/javac/lambda/T8024809/SelfInitializerInLambdaTesta.out
langtools/test/tools/javac/lambda/T8024809/SelfInitializerInLambdaTestb.java
langtools/test/tools/javac/lambda/T8024809/SelfInitializerInLambdaTestb.out
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java	Thu Aug 13 12:20:10 2015 -0700
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java	Thu Aug 13 14:14:59 2015 -0700
@@ -3686,10 +3686,6 @@
                                Env<AttrContext> env,
                                VarSymbol v,
                                boolean onlyWarning) {
-//          System.err.println(v + " " + ((v.flags() & STATIC) != 0) + " " +
-//                             tree.pos + " " + v.pos + " " +
-//                             Resolve.isStatic(env));//DEBUG
-
             // A forward reference is diagnosed if the declaration position
             // of the variable is greater than the current tree position
             // and the tree and variable definition occur in the same class
@@ -3697,14 +3693,15 @@
             // This check applies only to class and instance
             // variables.  Local variables follow different scope rules,
             // and are subject to definite assignment checking.
-            if ((env.info.enclVar == v || v.pos > tree.pos) &&
+            Env<AttrContext> initEnv = enclosingInitEnv(env);
+            if (initEnv != null &&
+                (initEnv.info.enclVar == v || v.pos > tree.pos) &&
                 v.owner.kind == TYP &&
-                enclosingInitEnv(env) != null &&
                 v.owner == env.info.scope.owner.enclClass() &&
                 ((v.flags() & STATIC) != 0) == Resolve.isStatic(env) &&
                 (!env.tree.hasTag(ASSIGN) ||
                  TreeInfo.skipParens(((JCAssign) env.tree).lhs) != tree)) {
-                String suffix = (env.info.enclVar == v) ?
+                String suffix = (initEnv.info.enclVar == v) ?
                                 "self.ref" : "forward.ref";
                 if (!onlyWarning || isStaticEnumField(v)) {
                     log.error(tree.pos(), "illegal." + suffix);
--- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/JavadocTool.java	Thu Aug 13 12:20:10 2015 -0700
+++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/JavadocTool.java	Thu Aug 13 14:14:59 2015 -0700
@@ -31,9 +31,12 @@
 import java.util.EnumSet;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
 import java.util.Map;
 import java.util.Set;
 
+import javax.tools.JavaFileManager;
 import javax.tools.JavaFileManager.Location;
 import javax.tools.JavaFileObject;
 import javax.tools.StandardJavaFileManager;
@@ -124,7 +127,7 @@
     public RootDocImpl getRootDocImpl(String doclocale,
                                       String encoding,
                                       ModifierFilter filter,
-                                      List<String> javaNames,
+                                      List<String> args,
                                       List<String[]> options,
                                       Iterable<? extends JavaFileObject> fileObjects,
                                       boolean breakiterator,
@@ -144,61 +147,79 @@
 
         javadocFinder.sourceCompleter = docClasses ? Completer.NULL_COMPLETER : sourceCompleter;
 
-        ListBuffer<String> names = new ListBuffer<>();
+        if (docClasses) {
+            // If -Xclasses is set, the args should be a series of class names
+            for (String arg: args) {
+                if (!isValidPackageName(arg)) // checks
+                    docenv.error(null, "main.illegal_class_name", arg);
+            }
+            if (messager.nerrors() != 0) {
+                return null;
+            }
+            return new RootDocImpl(docenv, args, options);
+        }
+
         ListBuffer<JCCompilationUnit> classTrees = new ListBuffer<>();
-        ListBuffer<JCCompilationUnit> packTrees = new ListBuffer<>();
+        Set<String> includedPackages = new LinkedHashSet<>();
 
         try {
             StandardJavaFileManager fm = docenv.fileManager instanceof StandardJavaFileManager
                     ? (StandardJavaFileManager) docenv.fileManager : null;
-            for (List<String> it = javaNames; it.nonEmpty(); it = it.tail) {
-                String name = it.head;
-                if (!docClasses && fm != null && name.endsWith(".java") && new File(name).exists()) {
-                    JavaFileObject fo = fm.getJavaFileObjects(name).iterator().next();
-                    parse(fo, classTrees, true);
-                } else if (isValidPackageName(name)) {
-                    names = names.append(name);
-                } else if (name.endsWith(".java")) {
+            Set<String> packageNames = new LinkedHashSet<>();
+            // Normally, the args should be a series of package names or file names.
+            // Parse the files and collect the package names.
+            for (String arg: args) {
+                if (fm != null && arg.endsWith(".java") && new File(arg).exists()) {
+                    parse(fm.getJavaFileObjects(arg), classTrees, true);
+                } else if (isValidPackageName(arg)) {
+                    packageNames.add(arg);
+                } else if (arg.endsWith(".java")) {
                     if (fm == null)
                         throw new IllegalArgumentException();
                     else
-                        docenv.error(null, "main.file_not_found", name);
+                        docenv.error(null, "main.file_not_found", arg);
                 } else {
-                    docenv.error(null, "main.illegal_package_name", name);
+                    docenv.error(null, "main.illegal_package_name", arg);
                 }
             }
-            for (JavaFileObject fo: fileObjects) {
-                parse(fo, classTrees, true);
-            }
 
-            if (!docClasses) {
-                // Recursively search given subpackages.  If any packages
-                //are found, add them to the list.
-                Map<String,List<JavaFileObject>> packageFiles =
-                        searchSubPackages(subPackages, names, excludedPackages);
+            // Parse file objects provide via the DocumentationTool API
+            parse(fileObjects, classTrees, true);
+
+            // Build up the complete list of any packages to be documented
+            Location location = docenv.fileManager.hasLocation(StandardLocation.SOURCE_PATH)
+                ? StandardLocation.SOURCE_PATH : StandardLocation.CLASS_PATH;
+
+            PackageTable t = new PackageTable(docenv.fileManager, location)
+                    .packages(packageNames)
+                    .subpackages(subPackages, excludedPackages);
+
+            includedPackages = t.getIncludedPackages();
 
-                // Parse the packages
-                for (List<String> packs = names.toList(); packs.nonEmpty(); packs = packs.tail) {
-                    // Parse sources ostensibly belonging to package.
-                    String packageName = packs.head;
-                    parsePackageClasses(packageName, packageFiles.get(packageName), packTrees, excludedPackages);
-                }
+            // Parse the files in the packages to be documented
+            ListBuffer<JCCompilationUnit> packageTrees = new ListBuffer<>();
+            for (String packageName: includedPackages) {
+                List<JavaFileObject> files = t.getFiles(packageName);
+                docenv.notice("main.Loading_source_files_for_package", packageName);
 
-                if (messager.nerrors() != 0) return null;
+                if (files.isEmpty())
+                    messager.warning(Messager.NOPOS, "main.no_source_files_for_package", packageName);
+                parse(files, packageTrees, false);
+            }
 
-                // Enter symbols for all files
-                docenv.notice("main.Building_tree");
-                javadocEnter.main(classTrees.toList().appendList(packTrees.toList()));
+            if (messager.nerrors() != 0) {
+                return null;
             }
+
+            // Enter symbols for all files
+            docenv.notice("main.Building_tree");
+            javadocEnter.main(classTrees.toList().appendList(packageTrees.toList()));
         } catch (Abort ex) {}
 
         if (messager.nerrors() != 0)
             return null;
 
-        if (docClasses)
-            return new RootDocImpl(docenv, javaNames, options);
-        else
-            return new RootDocImpl(docenv, listClasses(classTrees.toList()), names.toList(), options);
+        return new RootDocImpl(docenv, listClasses(classTrees.toList()), List.from(includedPackages), options);
     }
 
     /** Is the given string a valid package name? */
@@ -211,185 +232,17 @@
         return isValidClassName(s);
     }
 
-    /**
-     * search all directories in path for subdirectory name. Add all
-     * .java files found in such a directory to args.
-     */
-    private void parsePackageClasses(String name,
-            List<JavaFileObject> files,
-            ListBuffer<JCCompilationUnit> trees,
-            List<String> excludedPackages)
-            throws IOException {
-        if (excludedPackages.contains(name)) {
-            return;
-        }
-
-        docenv.notice("main.Loading_source_files_for_package", name);
-
-        if (files == null) {
-            Location location = docenv.fileManager.hasLocation(StandardLocation.SOURCE_PATH)
-                    ? StandardLocation.SOURCE_PATH : StandardLocation.CLASS_PATH;
-            ListBuffer<JavaFileObject> lb = new ListBuffer<>();
-            for (JavaFileObject fo: docenv.fileManager.list(
-                    location, name, EnumSet.of(JavaFileObject.Kind.SOURCE), false)) {
-                String binaryName = docenv.fileManager.inferBinaryName(location, fo);
-                String simpleName = getSimpleName(binaryName);
-                if (isValidClassName(simpleName)) {
-                    lb.append(fo);
-                }
-            }
-            files = lb.toList();
-        }
-        if (files.nonEmpty()) {
-            for (JavaFileObject fo : files) {
-                parse(fo, trees, false);
-            }
-        } else {
-            messager.warning(Messager.NOPOS, "main.no_source_files_for_package",
-                             name.replace(File.separatorChar, '.'));
-        }
-    }
-
-    private void parse(JavaFileObject fo, ListBuffer<JCCompilationUnit> trees,
+    private void parse(Iterable<? extends JavaFileObject> files, ListBuffer<JCCompilationUnit> trees,
                        boolean trace) {
-        if (uniquefiles.add(fo)) { // ignore duplicates
-            if (trace)
-                docenv.notice("main.Loading_source_file", fo.getName());
-            trees.append(parse(fo));
-        }
-    }
-
-    /**
-     * Recursively search all directories in path for subdirectory name.
-     * Add all packages found in such a directory to packages list.
-     */
-    private Map<String,List<JavaFileObject>> searchSubPackages(
-            List<String> subPackages,
-            ListBuffer<String> packages,
-            List<String> excludedPackages)
-            throws IOException {
-        Map<String,List<JavaFileObject>> packageFiles = new HashMap<>();
-
-        Map<String,Boolean> includedPackages = new HashMap<>();
-        includedPackages.put("", true);
-        for (String p: excludedPackages)
-            includedPackages.put(p, false);
-
-        StandardLocation path = docenv.fileManager.hasLocation(StandardLocation.SOURCE_PATH)
-                ? StandardLocation.SOURCE_PATH : StandardLocation.CLASS_PATH;
-
-        searchSubPackages(subPackages,
-                includedPackages,
-                packages, packageFiles,
-                path,
-                EnumSet.of(JavaFileObject.Kind.SOURCE));
-
-        return packageFiles;
-    }
-
-    private void searchSubPackages(List<String> subPackages,
-            Map<String,Boolean> includedPackages,
-            ListBuffer<String> packages,
-            Map<String, List<JavaFileObject>> packageFiles,
-            StandardLocation location, Set<JavaFileObject.Kind> kinds)
-            throws IOException {
-        for (String subPackage: subPackages) {
-            if (!isIncluded(subPackage, includedPackages))
-                continue;
-
-            for (JavaFileObject fo: docenv.fileManager.list(location, subPackage, kinds, true)) {
-                String binaryName = docenv.fileManager.inferBinaryName(location, fo);
-                String packageName = getPackageName(binaryName);
-                String simpleName = getSimpleName(binaryName);
-                if (isIncluded(packageName, includedPackages) && isValidClassName(simpleName)) {
-                    List<JavaFileObject> list = packageFiles.get(packageName);
-                    list = (list == null ? List.of(fo) : list.prepend(fo));
-                    packageFiles.put(packageName, list);
-                    if (!packages.contains(packageName))
-                        packages.add(packageName);
-                }
+        for (JavaFileObject fo: files) {
+            if (uniquefiles.add(fo)) { // ignore duplicates
+                if (trace)
+                    docenv.notice("main.Loading_source_file", fo.getName());
+                trees.append(parse(fo));
             }
         }
     }
 
-    private String getPackageName(String name) {
-        int lastDot = name.lastIndexOf(".");
-        return (lastDot == -1 ? "" : name.substring(0, lastDot));
-    }
-
-    private String getSimpleName(String name) {
-        int lastDot = name.lastIndexOf(".");
-        return (lastDot == -1 ? name : name.substring(lastDot + 1));
-    }
-
-    private boolean isIncluded(String packageName, Map<String,Boolean> includedPackages) {
-        Boolean b = includedPackages.get(packageName);
-        if (b == null) {
-            b = isIncluded(getPackageName(packageName), includedPackages);
-            includedPackages.put(packageName, b);
-        }
-        return b;
-    }
-
-    /**
-     * Recursively search all directories in path for subdirectory name.
-     * Add all packages found in such a directory to packages list.
-     */
-    private void searchSubPackage(String packageName,
-                                  ListBuffer<String> packages,
-                                  List<String> excludedPackages,
-                                  Collection<File> pathnames) {
-        if (excludedPackages.contains(packageName))
-            return;
-
-        String packageFilename = packageName.replace('.', File.separatorChar);
-        boolean addedPackage = false;
-        for (File pathname : pathnames) {
-            File f = new File(pathname, packageFilename);
-            String filenames[] = f.list();
-            // if filenames not null, then found directory
-            if (filenames != null) {
-                for (String filename : filenames) {
-                    if (!addedPackage
-                            && (isValidJavaSourceFile(filename) ||
-                                isValidJavaClassFile(filename))
-                            && !packages.contains(packageName)) {
-                        packages.append(packageName);
-                        addedPackage = true;
-                    } else if (isValidClassName(filename) &&
-                               (new File(f, filename)).isDirectory()) {
-                        searchSubPackage(packageName + "." + filename,
-                                         packages, excludedPackages, pathnames);
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Return true if given file name is a valid class file name.
-     * @param file the name of the file to check.
-     * @return true if given file name is a valid class file name
-     * and false otherwise.
-     */
-    private static boolean isValidJavaClassFile(String file) {
-        if (!file.endsWith(".class")) return false;
-        String clazzName = file.substring(0, file.length() - ".class".length());
-        return isValidClassName(clazzName);
-    }
-
-    /**
-     * Return true if given file name is a valid Java source file name.
-     * @param file the name of the file to check.
-     * @return true if given file name is a valid Java source file name
-     * and false otherwise.
-     */
-    private static boolean isValidJavaSourceFile(String file) {
-        if (!file.endsWith(".java")) return false;
-        String clazzName = file.substring(0, file.length() - ".java".length());
-        return isValidClassName(clazzName);
-    }
-
     /** Are surrogates supported?
      */
     final static boolean surrogatesSupported = surrogatesSupported();
@@ -445,4 +298,118 @@
         return result.toList();
     }
 
+    /**
+     * A table to manage included and excluded packages.
+     */
+    static class PackageTable {
+        private final Map<String, Entry> entries = new LinkedHashMap<>();
+        private final Set<String> includedPackages = new LinkedHashSet<>();
+        private final JavaFileManager fm;
+        private final Location location;
+        private final Set<JavaFileObject.Kind> sourceKinds = EnumSet.of(JavaFileObject.Kind.SOURCE);
+
+        /**
+         * Creates a table to manage included and excluded packages.
+         * @param fm The file manager used to locate source files
+         * @param locn the location used to locate source files
+         */
+        PackageTable(JavaFileManager fm, Location locn) {
+            this.fm = fm;
+            this.location = locn;
+            getEntry("").excluded = false;
+        }
+
+        PackageTable packages(Collection<String> packageNames) {
+            includedPackages.addAll(packageNames);
+            return this;
+        }
+
+        PackageTable subpackages(Collection<String> packageNames, Collection<String> excludePackageNames)
+                throws IOException {
+            for (String p: excludePackageNames) {
+                getEntry(p).excluded = true;
+            }
+
+            for (String packageName: packageNames) {
+                for (JavaFileObject fo: fm.list(location, packageName, sourceKinds, true)) {
+                    String binaryName = fm.inferBinaryName(location, fo);
+                    String pn = getPackageName(binaryName);
+                    String simpleName = getSimpleName(binaryName);
+                    Entry e = getEntry(pn);
+                    if (!e.isExcluded() && isValidClassName(simpleName)) {
+                        includedPackages.add(pn);
+                        e.files = (e.files == null ? List.of(fo) : e.files.prepend(fo));
+                    }
+                }
+            }
+            return this;
+        }
+
+        /**
+         * Returns the aggregate set of included packages.
+         * @return the aggregate set of included packages
+         */
+        Set<String> getIncludedPackages() {
+            return includedPackages;
+        }
+
+        /**
+         * Returns the set of source files for a package.
+         * @param packageName the specified package
+         * @return the set of file objects for the specified package
+         * @throws IOException if an error occurs while accessing the files
+         */
+        List<JavaFileObject> getFiles(String packageName) throws IOException {
+            Entry e = getEntry(packageName);
+            // The files may have been found as a side effect of searching for subpackages
+            if (e.files != null)
+                return e.files;
+
+            ListBuffer<JavaFileObject> lb = new ListBuffer<>();
+            for (JavaFileObject fo: fm.list(location, packageName, sourceKinds, false)) {
+                String binaryName = fm.inferBinaryName(location, fo);
+                String simpleName = getSimpleName(binaryName);
+                if (isValidClassName(simpleName)) {
+                    lb.append(fo);
+                }
+            }
+
+            return lb.toList();
+        }
+
+
+        private Entry getEntry(String name) {
+            Entry e = entries.get(name);
+            if (e == null)
+                entries.put(name, e = new Entry(name));
+            return e;
+        }
+
+        private String getPackageName(String name) {
+            int lastDot = name.lastIndexOf(".");
+            return (lastDot == -1 ? "" : name.substring(0, lastDot));
+        }
+
+        private String getSimpleName(String name) {
+            int lastDot = name.lastIndexOf(".");
+            return (lastDot == -1 ? name : name.substring(lastDot + 1));
+        }
+
+        class Entry {
+            final String name;
+            Boolean excluded;
+            List<JavaFileObject> files;
+
+            Entry(String name) {
+                this.name = name;
+            }
+
+            boolean isExcluded() {
+                if (excluded == null)
+                    excluded = getEntry(getPackageName(name)).isExcluded();
+                return excluded;
+            }
+        }
+    }
+
 }
--- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/resources/javadoc.properties	Thu Aug 13 12:20:10 2015 -0700
+++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/resources/javadoc.properties	Thu Aug 13 14:14:59 2015 -0700
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 #
 # This code is free software; you can redistribute it and/or modify it
@@ -91,6 +91,7 @@
 main.illegal_locale_name=Locale not available: {0}
 main.malformed_locale_name=Malformed locale name: {0}
 main.file_not_found=File not found: "{0}"
+main.illegal_class_name=Illegal class name: "{0}"
 main.illegal_package_name=Illegal package name: "{0}"
 main.release.bootclasspath.conflict=option {0} cannot be used together with -release
 main.unsupported.release.version=release version {0} not supported
--- a/langtools/test/tools/javac/lambda/T8024809/SelfInitializerInLambdaTesta.java	Thu Aug 13 12:20:10 2015 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,65 +0,0 @@
-/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * @test
- * @bug 8024809
- * @summary javac, some lambda programs are rejected by flow analysis
- * @compile/fail/ref=SelfInitializerInLambdaTesta.out -XDrawDiagnostics SelfInitializerInLambdaTesta.java
- */
-
-public class SelfInitializerInLambdaTesta {
-
-    final Runnable r1 = ()->System.out.println(r1);
-
-    final Object lock = new Object();
-
-    final Runnable r2 = ()->{
-        System.out.println(r2);
-        synchronized (lock){}
-    };
-
-    final Runnable r3 = ()->{
-        synchronized (lock){
-            System.out.println(r3);
-        }
-    };
-
-    final Runnable r4 = ()->{
-        System.out.println(r4);
-    };
-
-    interface SAM {
-        int m(String s);
-    }
-
-    final SAM s1 = (String s)->{
-        System.out.println(s + s1.toString());
-        return 0;
-    };
-
-    final SAM s2 = (s)->{
-        System.out.println(s + s2.toString());
-        return 0;
-    };
-}
--- a/langtools/test/tools/javac/lambda/T8024809/SelfInitializerInLambdaTesta.out	Thu Aug 13 12:20:10 2015 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-SelfInitializerInLambdaTesta.java:33:48: compiler.err.illegal.self.ref
-SelfInitializerInLambdaTesta.java:38:28: compiler.err.illegal.self.ref
-SelfInitializerInLambdaTesta.java:44:32: compiler.err.illegal.self.ref
-SelfInitializerInLambdaTesta.java:49:28: compiler.err.illegal.self.ref
-SelfInitializerInLambdaTesta.java:57:32: compiler.err.illegal.self.ref
-SelfInitializerInLambdaTesta.java:62:32: compiler.err.illegal.self.ref
-6 errors
--- a/langtools/test/tools/javac/lambda/T8024809/SelfInitializerInLambdaTestb.java	Thu Aug 13 12:20:10 2015 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * @test
- * @bug 8024809
- * @summary javac, some lambda programs are rejected by flow analysis
- * @compile/fail/ref=SelfInitializerInLambdaTestb.out -XDrawDiagnostics SelfInitializerInLambdaTestb.java
- */
-
-public class SelfInitializerInLambdaTestb {
-
-    final Runnable r1;
-
-    final Runnable r2 = ()-> System.out.println(r1);
-
-    SelfInitializerInLambdaTestb() {
-        r1 = ()->System.out.println(r1);
-    }
-}
--- a/langtools/test/tools/javac/lambda/T8024809/SelfInitializerInLambdaTestb.out	Thu Aug 13 12:20:10 2015 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-SelfInitializerInLambdaTestb.java:35:49: compiler.err.var.might.not.have.been.initialized: r1
-SelfInitializerInLambdaTestb.java:38:37: compiler.err.var.might.not.have.been.initialized: r1
-2 errors
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/lambda/self_initializer/T8024809/SelfInitializerInLambdaTesta.java	Thu Aug 13 14:14:59 2015 -0700
@@ -0,0 +1,42 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 8024809
+ * @summary javac, some lambda programs are rejected by flow analysis
+ * @compile/fail/ref=SelfInitializerInLambdaTesta.out -XDrawDiagnostics SelfInitializerInLambdaTesta.java
+ */
+
+public class SelfInitializerInLambdaTesta {
+
+    final Runnable r1 = ()->System.out.println(r1);
+
+    final Object lock = new Object();
+
+    final Runnable r2 = ()->{
+        System.out.println(r2);
+        synchronized (lock){}
+    };
+
+    final Runnable r3 = ()->{
+        synchronized (lock){
+            System.out.println(r3);
+        }
+    };
+
+    final Runnable r4 = ()->{
+        System.out.println(r4);
+    };
+
+    interface SAM {
+        int m(String s);
+    }
+
+    final SAM s1 = (String s)->{
+        System.out.println(s + s1.toString());
+        return 0;
+    };
+
+    final SAM s2 = (s)->{
+        System.out.println(s + s2.toString());
+        return 0;
+    };
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/lambda/self_initializer/T8024809/SelfInitializerInLambdaTesta.out	Thu Aug 13 14:14:59 2015 -0700
@@ -0,0 +1,7 @@
+SelfInitializerInLambdaTesta.java:10:48: compiler.err.illegal.self.ref
+SelfInitializerInLambdaTesta.java:15:28: compiler.err.illegal.self.ref
+SelfInitializerInLambdaTesta.java:21:32: compiler.err.illegal.self.ref
+SelfInitializerInLambdaTesta.java:26:28: compiler.err.illegal.self.ref
+SelfInitializerInLambdaTesta.java:34:32: compiler.err.illegal.self.ref
+SelfInitializerInLambdaTesta.java:39:32: compiler.err.illegal.self.ref
+6 errors
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/lambda/self_initializer/T8024809/SelfInitializerInLambdaTestb.java	Thu Aug 13 14:14:59 2015 -0700
@@ -0,0 +1,17 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 8024809
+ * @summary javac, some lambda programs are rejected by flow analysis
+ * @compile/fail/ref=SelfInitializerInLambdaTestb.out -XDrawDiagnostics SelfInitializerInLambdaTestb.java
+ */
+
+public class SelfInitializerInLambdaTestb {
+
+    final Runnable r1;
+
+    final Runnable r2 = ()-> System.out.println(r1);
+
+    SelfInitializerInLambdaTestb() {
+        r1 = ()->System.out.println(r1);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/lambda/self_initializer/T8024809/SelfInitializerInLambdaTestb.out	Thu Aug 13 14:14:59 2015 -0700
@@ -0,0 +1,3 @@
+SelfInitializerInLambdaTestb.java:12:49: compiler.err.var.might.not.have.been.initialized: r1
+SelfInitializerInLambdaTestb.java:15:37: compiler.err.var.might.not.have.been.initialized: r1
+2 errors
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/lambda/self_initializer/T8053906/SelfInitializerInLambdaTestc.java	Thu Aug 13 14:14:59 2015 -0700
@@ -0,0 +1,26 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 8053906
+ * @summary javac, some lambda programs are rejected by flow analysis
+ * @compile/fail/ref=SelfInitializerInLambdaTestc.out -XDrawDiagnostics SelfInitializerInLambdaTestc.java
+ */
+
+public class SelfInitializerInLambdaTestc {
+    interface SAM {
+        void foo();
+    }
+
+    final SAM notInitialized = ()-> {
+        SAM simpleVariable = () -> notInitialized.foo();
+    };
+
+    final SAM notInitialized2 = ()-> {
+        SAM simpleVariable1 = () -> {
+            SAM simpleVariable2 = () -> {
+                SAM simpleVariable3 = () -> {
+                    SAM simpleVariable4 = () -> notInitialized2.foo();
+                };
+            };
+        };
+    };
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/lambda/self_initializer/T8053906/SelfInitializerInLambdaTestc.out	Thu Aug 13 14:14:59 2015 -0700
@@ -0,0 +1,3 @@
+SelfInitializerInLambdaTestc.java:14:36: compiler.err.illegal.self.ref
+SelfInitializerInLambdaTestc.java:21:49: compiler.err.illegal.self.ref
+2 errors