From fa2cb78a09ccc5497a0975362162ee4d02f58b25 Mon Sep 17 00:00:00 2001 From: Maurizio Cimadamore Date: Thu, 5 Aug 2010 09:45:25 +0100 Subject: [PATCH] 6857948: Calling a constructor with a doubly bogus argument causes an internal error Problem when constructor resolution returns an erroneous symbol Reviewed-by: jjg --- .../classes/com/sun/tools/javac/comp/Attr.java | 16 +++++++++------- .../test/tools/javac/6857948/T6857948.java | 18 ++++++++++++++++++ .../test/tools/javac/6857948/T6857948.out | 3 +++ 3 files changed, 30 insertions(+), 7 deletions(-) create mode 100644 langtools/test/tools/javac/6857948/T6857948.java create mode 100644 langtools/test/tools/javac/6857948/T6857948.out diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java b/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java index b923c669ded..70dcc5f6df0 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java @@ -1594,13 +1594,15 @@ public class Attr extends JCTree.Visitor { localEnv.info.varArgs = false; tree.constructor = rs.resolveConstructor( tree.pos(), localEnv, clazztype, argtypes, typeargtypes); - tree.constructorType = checkMethod(clazztype, - tree.constructor, - localEnv, - tree.args, - argtypes, - typeargtypes, - localEnv.info.varArgs); + tree.constructorType = tree.constructor.type.isErroneous() ? + syms.errType : + checkMethod(clazztype, + tree.constructor, + localEnv, + tree.args, + argtypes, + typeargtypes, + localEnv.info.varArgs); if (localEnv.info.varArgs) assert tree.constructorType.isErroneous() || tree.varargsElement != null; } diff --git a/langtools/test/tools/javac/6857948/T6857948.java b/langtools/test/tools/javac/6857948/T6857948.java new file mode 100644 index 00000000000..e4f7ee527d9 --- /dev/null +++ b/langtools/test/tools/javac/6857948/T6857948.java @@ -0,0 +1,18 @@ +/* + * @test /nodynamiccopyright/ + * @bug 6857948 + * @summary 6857948: Calling a constructor with a doubly bogus argument causes an internal error + * @author Maurizio Cimadamore + * + * @compile/fail/ref=T6857948.out -XDrawDiagnostics T6857948.java + */ + +class Foo { + Foo(String v) {} +}; + +class Test { + public static void main() { + Foo f = new Foo("Hello!",nosuchfunction()) {}; + } +} diff --git a/langtools/test/tools/javac/6857948/T6857948.out b/langtools/test/tools/javac/6857948/T6857948.out new file mode 100644 index 00000000000..f6a79ed7745 --- /dev/null +++ b/langtools/test/tools/javac/6857948/T6857948.out @@ -0,0 +1,3 @@ +T6857948.java:16:32: compiler.err.cant.resolve.location.args: kindname.method, nosuchfunction, , , kindname.class, Test +T6857948.java:16:50: compiler.err.cant.apply.symbol: kindname.constructor, Foo, java.lang.String, compiler.misc.no.args, kindname.class, Foo, null +2 errors