8291914: generated constructors are considered compact when they shouldn't
Reviewed-by: darcy, jlahoda
This commit is contained in:
parent
9b971626f7
commit
95dd376ba2
@ -2302,7 +2302,8 @@ public class Flow {
|
|||||||
// leave caught unchanged.
|
// leave caught unchanged.
|
||||||
scan(tree.body);
|
scan(tree.body);
|
||||||
|
|
||||||
boolean isCompactConstructor = (tree.sym.flags() & Flags.COMPACT_RECORD_CONSTRUCTOR) != 0;
|
boolean isCompactOrGeneratedRecordConstructor = (tree.sym.flags() & Flags.COMPACT_RECORD_CONSTRUCTOR) != 0 ||
|
||||||
|
(tree.sym.flags() & (GENERATEDCONSTR | RECORD)) == (GENERATEDCONSTR | RECORD);
|
||||||
if (isInitialConstructor) {
|
if (isInitialConstructor) {
|
||||||
boolean isSynthesized = (tree.sym.flags() &
|
boolean isSynthesized = (tree.sym.flags() &
|
||||||
GENERATEDCONSTR) != 0;
|
GENERATEDCONSTR) != 0;
|
||||||
@ -2312,10 +2313,10 @@ public class Flow {
|
|||||||
if (var.owner == classDef.sym) {
|
if (var.owner == classDef.sym) {
|
||||||
// choose the diagnostic position based on whether
|
// choose the diagnostic position based on whether
|
||||||
// the ctor is default(synthesized) or not
|
// the ctor is default(synthesized) or not
|
||||||
if (isSynthesized && !isCompactConstructor) {
|
if (isSynthesized && !isCompactOrGeneratedRecordConstructor) {
|
||||||
checkInit(TreeInfo.diagnosticPositionFor(var, vardecl),
|
checkInit(TreeInfo.diagnosticPositionFor(var, vardecl),
|
||||||
var, Errors.VarNotInitializedInDefaultConstructor(var));
|
var, Errors.VarNotInitializedInDefaultConstructor(var));
|
||||||
} else if (isCompactConstructor) {
|
} else if (isCompactOrGeneratedRecordConstructor) {
|
||||||
boolean isInstanceRecordField = var.enclClass().isRecord() &&
|
boolean isInstanceRecordField = var.enclClass().isRecord() &&
|
||||||
(var.flags_field & (Flags.PRIVATE | Flags.FINAL | Flags.GENERATED_MEMBER | Flags.RECORD)) != 0 &&
|
(var.flags_field & (Flags.PRIVATE | Flags.FINAL | Flags.GENERATED_MEMBER | Flags.RECORD)) != 0 &&
|
||||||
!var.isStatic() &&
|
!var.isStatic() &&
|
||||||
|
@ -2770,7 +2770,8 @@ public class Lower extends TreeTranslator {
|
|||||||
lambdaTranslationMap = prevLambdaTranslationMap;
|
lambdaTranslationMap = prevLambdaTranslationMap;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (tree.name == names.init && (tree.sym.flags_field & Flags.COMPACT_RECORD_CONSTRUCTOR) != 0) {
|
if (tree.name == names.init && ((tree.sym.flags_field & Flags.COMPACT_RECORD_CONSTRUCTOR) != 0 ||
|
||||||
|
(tree.sym.flags_field & (GENERATEDCONSTR | RECORD)) == (GENERATEDCONSTR | RECORD))) {
|
||||||
// lets find out if there is any field waiting to be initialized
|
// lets find out if there is any field waiting to be initialized
|
||||||
ListBuffer<VarSymbol> fields = new ListBuffer<>();
|
ListBuffer<VarSymbol> fields = new ListBuffer<>();
|
||||||
for (Symbol sym : currentClass.getEnclosedElements()) {
|
for (Symbol sym : currentClass.getEnclosedElements()) {
|
||||||
|
@ -1417,7 +1417,7 @@ public class TypeEnter implements Completer {
|
|||||||
/* if we have to generate a default constructor for records we will treat it as the compact one
|
/* if we have to generate a default constructor for records we will treat it as the compact one
|
||||||
* to trigger field initialization later on
|
* to trigger field initialization later on
|
||||||
*/
|
*/
|
||||||
csym.flags_field |= Flags.COMPACT_RECORD_CONSTRUCTOR | GENERATEDCONSTR;
|
csym.flags_field |= GENERATEDCONSTR;
|
||||||
ListBuffer<VarSymbol> params = new ListBuffer<>();
|
ListBuffer<VarSymbol> params = new ListBuffer<>();
|
||||||
JCVariableDecl lastField = recordFieldDecls.last();
|
JCVariableDecl lastField = recordFieldDecls.last();
|
||||||
for (JCVariableDecl field : recordFieldDecls) {
|
for (JCVariableDecl field : recordFieldDecls) {
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* @test
|
* @test
|
||||||
* @bug 8289249
|
* @bug 8289249 8291914
|
||||||
* @summary Test Elements.{isCompactConstructor, isCanonicalConstructor}
|
* @summary Test Elements.{isCompactConstructor, isCanonicalConstructor}
|
||||||
* @library /tools/javac/lib
|
* @library /tools/javac/lib
|
||||||
* @build JavacTestingAbstractProcessor TestRecordPredicates
|
* @build JavacTestingAbstractProcessor TestRecordPredicates
|
||||||
@ -107,7 +107,7 @@ public class TestRecordPredicates extends JavacTestingAbstractProcessor {
|
|||||||
boolean isCanonical() default false;
|
boolean isCanonical() default false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ExpectedPredicates(isCompact=true, isCanonical=true)
|
@ExpectedPredicates(isCompact=false, isCanonical=true)
|
||||||
record RecordCompactCtor(int foo, double bar) {}
|
record RecordCompactCtor(int foo, double bar) {}
|
||||||
|
|
||||||
// Example from JLS 8.10.4.2
|
// Example from JLS 8.10.4.2
|
||||||
|
Loading…
x
Reference in New Issue
Block a user