[cfe] Handle potentially constant types in instantiations
Part of https://github.com/dart-lang/sdk/issues/46232
Closes #47154
Change-Id: I71fe16d26facf29bdae1b98971c4ccfe18f95e80
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/213772
Reviewed-by: Chloe Stefantsova <dmitryas@google.com>
Commit-Queue: Johnni Winther <johnniwinther@google.com>
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/stack_listener.dart b/pkg/_fe_analyzer_shared/lib/src/parser/stack_listener.dart
index d475eed..208db61 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/stack_listener.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/stack_listener.dart
@@ -69,6 +69,7 @@
TypeList,
TypeVariable,
TypeVariables,
+ UnresolvedType,
VarFinalOrConstToken,
WithClause,
}
@@ -374,7 +375,7 @@
@override
void handleNoType(Token lastConsumed) {
debugEvent("NoType");
- push(NullValue.Type);
+ push(NullValue.UnresolvedType);
}
@override
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index 38edea3..3bf60515 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -56,7 +56,6 @@
import '../builder/extension_builder.dart';
import '../builder/factory_builder.dart';
import '../builder/field_builder.dart';
-import '../builder/fixed_type_builder.dart';
import '../builder/formal_parameter_builder.dart';
import '../builder/function_builder.dart';
import '../builder/function_type_builder.dart';
@@ -219,7 +218,10 @@
/// When parsing this initializer `x = x`, `x` must be resolved in two
/// different scopes. The first `x` must be resolved in the class' scope, the
/// second in the formal parameter scope.
- bool inInitializer = false;
+ bool inInitializerLeftHandSide = false;
+
+ /// This is set to true when we are parsing constructor initializers.
+ bool inConstructorInitializer = false;
/// Set to `true` when we are parsing a field initializer either directly
/// or within an initializer list.
@@ -264,7 +266,6 @@
Link<bool> _isOrAsOperatorTypeState = const Link<bool>().prepend(false);
- @override
bool get inIsOrAsOperatorType => _isOrAsOperatorTypeState.head;
Link<bool> _localInitializerState = const Link<bool>().prepend(false);
@@ -294,7 +295,7 @@
@override
ConstantContext constantContext = ConstantContext.none;
- UnresolvedType? currentLocalVariableType;
+ DartType? currentLocalVariableType;
// Using non-null value to initialize this field based on performance advice
// from VM engineers. TODO(ahe): Does this still apply?
@@ -478,7 +479,7 @@
if (node is DartType) {
unhandled("DartType", "push", -1, uri);
}
- inInitializer = false;
+ inInitializerLeftHandSide = false;
super.push(node);
}
@@ -852,7 +853,7 @@
// `invalid-type`.
UnresolvedType? type = pop() as UnresolvedType?;
if (type != null) {
- buildDartType(type);
+ buildDartType(type, allowPotentiallyConstantType: false);
}
}
pop(); // Annotations.
@@ -956,6 +957,7 @@
if (functionNestingLevel == 0) {
prepareInitializers();
}
+ inConstructorInitializer = true;
}
@override
@@ -964,12 +966,13 @@
if (functionNestingLevel == 0) {
scope = formalParameterScope ?? new Scope.immutable();
}
+ inConstructorInitializer = false;
}
@override
void beginInitializer(Token token) {
debugEvent("beginInitializer");
- inInitializer = true;
+ inInitializerLeftHandSide = true;
inFieldInitializer = true;
}
@@ -985,7 +988,7 @@
debugEvent("endInitializer");
inFieldInitializer = false;
- assert(!inInitializer);
+ assert(!inInitializerLeftHandSide);
Object? node = pop();
List<Initializer> initializers;
@@ -1805,7 +1808,9 @@
if (isInForest) {
assert(forest.argumentsTypeArguments(arguments).isEmpty);
forest.argumentsSetTypeArguments(
- arguments, buildDartTypeArguments(typeArguments));
+ arguments,
+ buildDartTypeArguments(typeArguments,
+ allowPotentiallyConstantType: false));
} else {
assert(typeArguments == null ||
(receiver is TypeUseGenerator &&
@@ -2357,25 +2362,15 @@
debugEvent("handleIdentifier");
String name = token.lexeme;
if (context.isScopeReference) {
- assert(!inInitializer ||
+ assert(!inInitializerLeftHandSide ||
this.scope == enclosingScope ||
this.scope.parent == enclosingScope);
// This deals with this kind of initializer: `C(a) : a = a;`
- Scope scope = inInitializer ? enclosingScope : this.scope;
+ Scope scope = inInitializerLeftHandSide ? enclosingScope : this.scope;
push(scopeLookup(scope, name, token));
} else {
- if (context.inDeclaration) {
- if (context == IdentifierContext.topLevelVariableDeclaration ||
- context == IdentifierContext.fieldDeclaration) {
- constantContext = member.isConst
- ? ConstantContext.inferred
- : !member.isStatic &&
- classBuilder != null &&
- classBuilder!.declaresConstConstructor
- ? ConstantContext.required
- : ConstantContext.none;
- }
- } else if (constantContext != ConstantContext.none &&
+ if (!context.inDeclaration &&
+ constantContext != ConstantContext.none &&
!context.allowedInConstantExpression) {
addProblem(fasta.messageNotAConstantExpression, token.charOffset,
token.length);
@@ -2446,7 +2441,7 @@
if (declaration != null &&
declaration.isDeclarationInstanceMember &&
(inFieldInitializer && !inLateFieldInitializer) &&
- !inInitializer) {
+ !inInitializerLeftHandSide) {
// We cannot access a class instance member in an initializer of a
// field.
//
@@ -2469,7 +2464,8 @@
if (!isQualified && isDeclarationInstanceContext) {
assert(declaration == null);
if (constantContext != ConstantContext.none ||
- (inFieldInitializer && !inLateFieldInitializer) && !inInitializer) {
+ (inFieldInitializer && !inLateFieldInitializer) &&
+ !inInitializerLeftHandSide) {
return new UnresolvedNameGenerator(this, token, n,
unresolvedReadKind: UnresolvedKind.Unknown);
}
@@ -2521,7 +2517,7 @@
}
} else if (declaration.isClassInstanceMember) {
if (constantContext != ConstantContext.none &&
- !inInitializer &&
+ !inInitializerLeftHandSide &&
// TODO(ahe): This is a hack because Fasta sets up the scope
// "this.field" parameters according to old semantics. Under the new
// semantics, such parameters introduces a new parameter with that
@@ -2884,9 +2880,7 @@
identifier.name, functionNestingLevel,
forSyntheticToken: identifier.token.isSynthetic,
initializer: initializer,
- type: currentLocalVariableType != null
- ? buildDartType(currentLocalVariableType!)
- : null,
+ type: currentLocalVariableType,
isFinal: isFinal,
isConst: isConst,
isLate: isLate,
@@ -2906,6 +2900,13 @@
@override
void beginFieldInitializer(Token token) {
inFieldInitializer = true;
+ constantContext = member.isConst
+ ? ConstantContext.inferred
+ : !member.isStatic &&
+ classBuilder != null &&
+ classBuilder!.declaresConstConstructor
+ ? ConstantContext.required
+ : ConstantContext.none;
if (member is FieldBuilder) {
FieldBuilder fieldBuilder = member as FieldBuilder;
inLateFieldInitializer = fieldBuilder.isLate;
@@ -2928,17 +2929,26 @@
inLateFieldInitializer = false;
assert(assignmentOperator.stringValue == "=");
push(popForValue());
+ constantContext = ConstantContext.none;
}
@override
void handleNoFieldInitializer(Token token) {
debugEvent("NoFieldInitializer");
+ constantContext = member.isConst
+ ? ConstantContext.inferred
+ : !member.isStatic &&
+ classBuilder != null &&
+ classBuilder!.declaresConstConstructor
+ ? ConstantContext.required
+ : ConstantContext.none;
if (constantContext == ConstantContext.inferred) {
// Creating a null value to prevent the Dart VM from crashing.
push(forest.createNullLiteral(offsetForToken(token)));
} else {
push(NullValue.FieldInitializer);
}
+ constantContext = ConstantContext.none;
}
@override
@@ -2963,7 +2973,11 @@
if (!libraryBuilder.isNonNullableByDefault) {
reportNonNullableModifierError(lateToken);
}
- UnresolvedType? type = pop() as UnresolvedType?;
+ UnresolvedType? unresolvedType =
+ pop(NullValue.UnresolvedType) as UnresolvedType?;
+ DartType? type = unresolvedType != null
+ ? buildDartType(unresolvedType, allowPotentiallyConstantType: false)
+ : null;
int modifiers = (lateToken != null ? lateMask : 0) |
Modifier.validateVarFinalOrConst(varFinalOrConst?.lexeme);
_enterLocalState(inLateLocalInitializer: lateToken != null);
@@ -2983,7 +2997,7 @@
if (count == 1) {
Object? node = pop();
constantContext = pop() as ConstantContext;
- currentLocalVariableType = pop() as UnresolvedType?;
+ currentLocalVariableType = pop(NullValue.Type) as DartType?;
currentLocalVariableModifiers = pop() as int;
List<Expression>? annotations = pop() as List<Expression>?;
if (node is ParserRecovery) {
@@ -3003,7 +3017,7 @@
const FixedNullableList<VariableDeclaration>()
.popNonNullable(stack, count, dummyVariableDeclaration);
constantContext = pop() as ConstantContext;
- currentLocalVariableType = pop() as UnresolvedType?;
+ currentLocalVariableType = pop(NullValue.Type) as DartType?;
currentLocalVariableModifiers = pop() as int;
List<Expression>? annotations = pop() as List<Expression>?;
if (variables == null) {
@@ -3404,7 +3418,8 @@
lengthOfSpan(leftBracket, leftBracket.endGroup));
typeArgument = const InvalidType();
} else {
- typeArgument = buildDartType(typeArguments.single);
+ typeArgument = buildDartType(typeArguments.single,
+ allowPotentiallyConstantType: false);
typeArgument = instantiateToBounds(
typeArgument, coreTypes.objectClass, libraryBuilder.library);
}
@@ -3428,7 +3443,8 @@
Token leftBrace, List<dynamic>? setOrMapEntries) {
DartType typeArgument;
if (typeArguments != null) {
- typeArgument = buildDartType(typeArguments.single);
+ typeArgument = buildDartType(typeArguments.single,
+ allowPotentiallyConstantType: false);
typeArgument = instantiateToBounds(
typeArgument, coreTypes.objectClass, libraryBuilder.library);
} else {
@@ -3568,8 +3584,10 @@
keyType = const InvalidType();
valueType = const InvalidType();
} else {
- keyType = buildDartType(typeArguments[0]);
- valueType = buildDartType(typeArguments[1]);
+ keyType = buildDartType(typeArguments[0],
+ allowPotentiallyConstantType: false);
+ valueType = buildDartType(typeArguments[1],
+ allowPotentiallyConstantType: false);
keyType = instantiateToBounds(
keyType, coreTypes.objectClass, libraryBuilder.library);
valueType = instantiateToBounds(
@@ -3698,8 +3716,19 @@
}
TypeBuilder? result;
if (name is Generator) {
+ bool allowPotentiallyConstantType;
+ if (libraryBuilder.isNonNullableByDefault) {
+ if (enableConstructorTearOffsInLibrary) {
+ allowPotentiallyConstantType = true;
+ } else {
+ allowPotentiallyConstantType = inIsOrAsOperatorType;
+ }
+ } else {
+ allowPotentiallyConstantType = false;
+ }
result = name.buildTypeWithResolvedArguments(
- libraryBuilder.nullableBuilderIfTrue(isMarkedAsNullable), arguments);
+ libraryBuilder.nullableBuilderIfTrue(isMarkedAsNullable), arguments,
+ allowPotentiallyConstantType: allowPotentiallyConstantType);
// ignore: unnecessary_null_comparison
if (result == null) {
unhandled("null", "result", beginToken.charOffset, uri);
@@ -3944,7 +3973,7 @@
// where not calling [buildDartType] leads to a missing compile-time
// error. Also, notice that the type of the problematic parameter isn't
// `invalid-type`.
- buildDartType(type);
+ buildDartType(type, allowPotentiallyConstantType: false);
}
int modifiers = pop() as int;
if (inCatchClause) {
@@ -4152,7 +4181,8 @@
popIfNotNull(onKeyword) as UnresolvedType?;
DartType exceptionType;
if (unresolvedExceptionType != null) {
- exceptionType = buildDartType(unresolvedExceptionType);
+ exceptionType = buildDartType(unresolvedExceptionType,
+ allowPotentiallyConstantType: false);
} else {
exceptionType = (libraryBuilder.isNonNullableByDefault
? coreTypes.objectNonNullableRawType
@@ -4855,8 +4885,11 @@
if (enableConstructorTearOffsInLibrary && inImplicitCreationContext) {
Expression receiver = receiverFunction();
if (typeArguments != null) {
- receiver = forest.createInstantiation(instantiationOffset, receiver,
- buildDartTypeArguments(typeArguments));
+ receiver = forest.createInstantiation(
+ instantiationOffset,
+ receiver,
+ buildDartTypeArguments(typeArguments,
+ allowPotentiallyConstantType: true));
}
return forest.createMethodInvocation(invocationOffset, receiver,
new Name(constructorName, libraryBuilder.nameOrigin), arguments);
@@ -4864,7 +4897,9 @@
if (typeArguments != null) {
assert(forest.argumentsTypeArguments(arguments).isEmpty);
forest.argumentsSetTypeArguments(
- arguments, buildDartTypeArguments(typeArguments));
+ arguments,
+ buildDartTypeArguments(typeArguments,
+ allowPotentiallyConstantType: false));
}
return buildUnresolvedError(
forest.createNullLiteral(instantiationOffset),
@@ -5085,7 +5120,9 @@
if (typeArguments != null && !isTypeArgumentsInForest) {
assert(forest.argumentsTypeArguments(arguments).isEmpty);
forest.argumentsSetTypeArguments(
- arguments, buildDartTypeArguments(typeArguments));
+ arguments,
+ buildDartTypeArguments(typeArguments,
+ allowPotentiallyConstantType: false));
}
}
if (type is ClassBuilder) {
@@ -5319,7 +5356,7 @@
push(_createReadOnlyVariableAccess(extensionThis!, token,
offsetForToken(token), 'this', ReadOnlyAccessKind.ExtensionThis));
} else {
- push(new ThisAccessGenerator(this, token, inInitializer,
+ push(new ThisAccessGenerator(this, token, inInitializerLeftHandSide,
inFieldInitializer, inLateFieldInitializer));
}
} else {
@@ -5336,7 +5373,7 @@
extensionThis == null) {
MemberBuilder memberBuilder = member as MemberBuilder;
memberBuilder.member.transformerFlags |= TransformerFlag.superCalls;
- push(new ThisAccessGenerator(this, token, inInitializer,
+ push(new ThisAccessGenerator(this, token, inInitializerLeftHandSide,
inFieldInitializer, inLateFieldInitializer,
isSuper: true));
} else {
@@ -5979,7 +6016,7 @@
// If in an assert initializer, make sure [inInitializer] is false so we
// use the formal parameter scope. If this is any other kind of assert,
// inInitializer should be false anyway.
- inInitializer = false;
+ inInitializerLeftHandSide = false;
}
@override
@@ -6765,7 +6802,9 @@
openAngleBracket.charOffset, noLength));
} else {
push(new Instantiation(
- toValue(operand), buildDartTypeArguments(typeArguments))
+ toValue(operand),
+ buildDartTypeArguments(typeArguments,
+ allowPotentiallyConstantType: true))
..fileOffset = openAngleBracket.charOffset);
}
} else {
@@ -6780,94 +6819,72 @@
}
@override
- UnresolvedType validateTypeUse(UnresolvedType unresolved,
- {required bool nonInstanceAccessIsError,
- required bool allowPotentiallyConstantType}) {
- // ignore: unnecessary_null_comparison
- assert(nonInstanceAccessIsError != null);
+ UnresolvedType validateTypeVariableUse(UnresolvedType unresolved,
+ {required bool allowPotentiallyConstantType}) {
// ignore: unnecessary_null_comparison
assert(allowPotentiallyConstantType != null);
- TypeBuilder builder = unresolved.builder;
- if (builder is NamedTypeBuilder && builder.declaration!.isTypeVariable) {
- TypeVariableBuilder typeParameterBuilder =
- builder.declaration as TypeVariableBuilder;
- TypeParameter typeParameter = typeParameterBuilder.parameter;
- LocatedMessage? message = _validateTypeUseIsInternal(
- builder, unresolved.fileUri, unresolved.charOffset,
- allowPotentiallyConstantType: allowPotentiallyConstantType);
- if (message == null) return unresolved;
- return new UnresolvedType(
- new NamedTypeBuilder(typeParameter.name!, builder.nullabilityBuilder,
- /* arguments = */ null, unresolved.fileUri, unresolved.charOffset)
- ..bind(new InvalidTypeDeclarationBuilder(
- typeParameter.name!, message)),
- unresolved.charOffset,
- unresolved.fileUri);
- } else if (builder is FunctionTypeBuilder) {
- LocatedMessage? message = _validateTypeUseIsInternal(
- builder, unresolved.fileUri, unresolved.charOffset,
- allowPotentiallyConstantType: allowPotentiallyConstantType);
- if (message == null) return unresolved;
- // TODO(johnniwinther): We should either remove this method completely and
- // fully handle this with `nonInstanceContext`, or fully handle all types
- // and remove `nonInstanceContext`.
- return new UnresolvedType(
- new FixedTypeBuilder(
- const InvalidType(), unresolved.fileUri, unresolved.charOffset),
- unresolved.charOffset,
- unresolved.fileUri);
- }
+ _validateTypeVariableUseInternal(
+ unresolved.builder, unresolved.fileUri, unresolved.charOffset,
+ allowPotentiallyConstantType: allowPotentiallyConstantType);
return unresolved;
}
- LocatedMessage? _validateTypeUseIsInternal(
+ void _validateTypeVariableUseInternal(
TypeBuilder? builder, Uri fileUri, int charOffset,
{required bool allowPotentiallyConstantType}) {
// ignore: unnecessary_null_comparison
assert(allowPotentiallyConstantType != null);
- if (builder is NamedTypeBuilder && builder.declaration!.isTypeVariable) {
- TypeVariableBuilder typeParameterBuilder =
- builder.declaration as TypeVariableBuilder;
- TypeParameter typeParameter = typeParameterBuilder.parameter;
- LocatedMessage message;
- bool extensionField =
- member.isExtensionMember && member.isField && !member.isExternal;
- if ((extensionField || !isDeclarationInstanceContext) &&
- (typeParameter.parent is Class ||
- typeParameter.parent is Extension)) {
- message = fasta.messageTypeVariableInStaticContext.withLocation(
- builder.fileUri ?? fileUri,
- builder.charOffset ?? charOffset,
- typeParameter.name!.length);
- } else if (constantContext == ConstantContext.inferred &&
- !allowPotentiallyConstantType) {
- message = fasta.messageTypeVariableInConstantContext
- .withLocation(fileUri, charOffset, typeParameter.name!.length);
- } else {
- return null;
+ if (builder is NamedTypeBuilder) {
+ if (builder.declaration!.isTypeVariable) {
+ TypeVariableBuilder typeParameterBuilder =
+ builder.declaration as TypeVariableBuilder;
+ TypeParameter typeParameter = typeParameterBuilder.parameter;
+ bool extensionField =
+ member.isExtensionMember && member.isField && !member.isExternal;
+ if ((extensionField || !isDeclarationInstanceContext) &&
+ (typeParameter.parent is Class ||
+ typeParameter.parent is Extension)) {
+ // TODO(johnniwinther): Can we unify this check with the similar check
+ // in NamedTypeBuilder.buildTypeInternal. If we skip it here, the
+ // error below (type variable in constant context) will be emitted
+ // _instead_ of this (type variable in static context), which seems
+ // like an odd prioritization.
+ LocatedMessage message = fasta.messageTypeVariableInStaticContext
+ .withLocation(builder.fileUri ?? fileUri,
+ builder.charOffset ?? charOffset, typeParameter.name!.length);
+ builder.bind(
+ new InvalidTypeDeclarationBuilder(typeParameter.name!, message));
+ addProblem(message.messageObject, message.charOffset, message.length);
+ } else if (constantContext != ConstantContext.none &&
+ (!inConstructorInitializer || !allowPotentiallyConstantType)) {
+ LocatedMessage message = fasta.messageTypeVariableInConstantContext
+ .withLocation(fileUri, charOffset, typeParameter.name!.length);
+ builder.bind(
+ new InvalidTypeDeclarationBuilder(typeParameter.name!, message));
+ addProblem(message.messageObject, message.charOffset, message.length);
+ }
}
- addProblem(message.messageObject, message.charOffset, message.length);
- return message;
+ if (builder.arguments != null) {
+ for (TypeBuilder typeBuilder in builder.arguments!) {
+ _validateTypeVariableUseInternal(
+ typeBuilder,
+ typeBuilder.fileUri ?? fileUri,
+ typeBuilder.charOffset ?? charOffset,
+ allowPotentiallyConstantType: allowPotentiallyConstantType);
+ }
+ }
} else if (builder is FunctionTypeBuilder) {
- LocatedMessage? result = _validateTypeUseIsInternal(
- builder.returnType, fileUri, charOffset,
+ _validateTypeVariableUseInternal(builder.returnType, fileUri, charOffset,
allowPotentiallyConstantType: allowPotentiallyConstantType);
- if (result != null) {
- return result;
- }
if (builder.formals != null) {
for (FormalParameterBuilder formalParameterBuilder
in builder.formals!) {
- result = _validateTypeUseIsInternal(
+ _validateTypeVariableUseInternal(
formalParameterBuilder.type, fileUri, charOffset,
allowPotentiallyConstantType: allowPotentiallyConstantType);
- if (result != null) {
- return result;
- }
}
}
}
- return null;
}
@override
@@ -7026,10 +7043,8 @@
@override
DartType buildDartType(UnresolvedType unresolvedType,
- {bool nonInstanceAccessIsError: false,
- bool allowPotentiallyConstantType: false}) {
- return validateTypeUse(unresolvedType,
- nonInstanceAccessIsError: nonInstanceAccessIsError,
+ {required bool allowPotentiallyConstantType}) {
+ return validateTypeVariableUse(unresolvedType,
allowPotentiallyConstantType: allowPotentiallyConstantType)
.builder
.build(libraryBuilder);
@@ -7037,20 +7052,21 @@
@override
DartType buildTypeLiteralDartType(UnresolvedType unresolvedType,
- {bool nonInstanceAccessIsError: false,
- bool allowPotentiallyConstantType: false}) {
- return validateTypeUse(unresolvedType,
- nonInstanceAccessIsError: nonInstanceAccessIsError,
+ {required bool allowPotentiallyConstantType}) {
+ return validateTypeVariableUse(unresolvedType,
allowPotentiallyConstantType: allowPotentiallyConstantType)
.builder
.buildTypeLiteralType(libraryBuilder);
}
@override
- List<DartType> buildDartTypeArguments(List<UnresolvedType>? unresolvedTypes) {
+ List<DartType> buildDartTypeArguments(List<UnresolvedType>? unresolvedTypes,
+ {required bool allowPotentiallyConstantType}) {
if (unresolvedTypes == null) return <DartType>[];
return new List<DartType>.generate(
- unresolvedTypes.length, (int i) => buildDartType(unresolvedTypes[i]),
+ unresolvedTypes.length,
+ (int i) => buildDartType(unresolvedTypes[i],
+ allowPotentiallyConstantType: allowPotentiallyConstantType),
growable: true);
}
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
index 930527d..04979e2 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
@@ -260,7 +260,9 @@
Expression_Generator applyTypeArguments(
int fileOffset, List<UnresolvedType>? typeArguments) {
return new Instantiation(
- buildSimpleRead(), _helper.buildDartTypeArguments(typeArguments))
+ buildSimpleRead(),
+ _helper.buildDartTypeArguments(typeArguments,
+ allowPotentiallyConstantType: true))
..fileOffset = fileOffset;
}
@@ -270,7 +272,8 @@
/// The type arguments have not been resolved and should be resolved to
/// create a [TypeBuilder] for a valid type.
TypeBuilder buildTypeWithResolvedArguments(
- NullabilityBuilder nullabilityBuilder, List<UnresolvedType>? arguments) {
+ NullabilityBuilder nullabilityBuilder, List<UnresolvedType>? arguments,
+ {required bool allowPotentiallyConstantType}) {
// TODO(johnniwinther): Could we use a FixedTypeBuilder(InvalidType()) here?
NamedTypeBuilder result = new NamedTypeBuilder(
token.lexeme,
@@ -2897,11 +2900,13 @@
@override
TypeBuilder buildTypeWithResolvedArguments(
- NullabilityBuilder nullabilityBuilder, List<UnresolvedType>? arguments) {
+ NullabilityBuilder nullabilityBuilder, List<UnresolvedType>? arguments,
+ {required bool allowPotentiallyConstantType}) {
String name = "${prefixGenerator._plainNameForRead}."
"${suffixGenerator._plainNameForRead}";
TypeBuilder type = suffixGenerator.buildTypeWithResolvedArguments(
- nullabilityBuilder, arguments);
+ nullabilityBuilder, arguments,
+ allowPotentiallyConstantType: allowPotentiallyConstantType);
LocatedMessage message;
if (type is NamedTypeBuilder &&
type.declaration is InvalidTypeDeclarationBuilder) {
@@ -2912,7 +2917,8 @@
int charOffset = offsetForToken(prefixGenerator.token);
message = templateDeferredTypeAnnotation
.withArguments(
- _helper.buildDartType(new UnresolvedType(type, charOffset, _uri)),
+ _helper.buildDartType(new UnresolvedType(type, charOffset, _uri),
+ allowPotentiallyConstantType: allowPotentiallyConstantType),
prefixGenerator._plainNameForRead,
_helper.libraryBuilder.isNonNullableByDefault)
.withLocation(
@@ -3022,17 +3028,19 @@
@override
TypeBuilder buildTypeWithResolvedArguments(
- NullabilityBuilder nullabilityBuilder, List<UnresolvedType>? arguments) {
+ NullabilityBuilder nullabilityBuilder, List<UnresolvedType>? arguments,
+ {required bool allowPotentiallyConstantType}) {
if (declaration.isExtension && !_helper.enableExtensionTypesInLibrary) {
// Extension declarations cannot be used as types.
- return super
- .buildTypeWithResolvedArguments(nullabilityBuilder, arguments);
+ return super.buildTypeWithResolvedArguments(nullabilityBuilder, arguments,
+ allowPotentiallyConstantType: allowPotentiallyConstantType);
}
if (arguments != null) {
int expected = declaration.typeVariablesCount;
if (arguments.length != expected) {
// Build the type arguments to report any errors they may have.
- _helper.buildDartTypeArguments(arguments);
+ _helper.buildDartTypeArguments(arguments,
+ allowPotentiallyConstantType: allowPotentiallyConstantType);
_helper.warnTypeArgumentsMismatch(
declaration.name, expected, fileOffset);
// We ignore the provided arguments, which will in turn return the
@@ -3048,11 +3056,8 @@
argumentBuilders =
new List<TypeBuilder>.generate(arguments.length, (int i) {
return _helper
- .validateTypeUse(arguments![i],
- nonInstanceAccessIsError: false,
- allowPotentiallyConstantType:
- _helper.libraryBuilder.isNonNullableByDefault &&
- _helper.inIsOrAsOperatorType)
+ .validateTypeVariableUse(arguments![i],
+ allowPotentiallyConstantType: allowPotentiallyConstantType)
.builder;
}, growable: false);
}
@@ -3105,10 +3110,12 @@
new UnresolvedType(
buildTypeWithResolvedArguments(
_helper.libraryBuilder.nonNullableBuilder,
- typeArguments),
+ typeArguments,
+ allowPotentiallyConstantType: true),
fileOffset,
_uri),
- nonInstanceAccessIsError: true));
+ allowPotentiallyConstantType:
+ _helper.enableConstructorTearOffsInLibrary));
}
}
return _expression!;
@@ -3131,8 +3138,16 @@
isUsedAsClass: true,
usedAsClassCharOffset: this.fileOffset,
usedAsClassFileUri: _uri);
- List<TypeBuilder>? aliasedTypeArguments =
- typeArguments?.map((unknownType) => unknownType.builder).toList();
+
+ bool isConstructorTearOff = send is PropertySelector &&
+ _helper.enableConstructorTearOffsInLibrary &&
+ declarationBuilder is ClassBuilder;
+ List<TypeBuilder>? aliasedTypeArguments = typeArguments
+ ?.map((unknownType) => _helper
+ .validateTypeVariableUse(unknownType,
+ allowPotentiallyConstantType: isConstructorTearOff)
+ .builder)
+ .toList();
if (aliasedTypeArguments != null &&
aliasedTypeArguments.length != aliasBuilder.typeVariablesCount) {
_helper.libraryBuilder.addProblem(
@@ -3236,8 +3251,9 @@
_helper.libraryBuilder, unaliasedTypeArguments);
}
} else if (typeArguments != null) {
- builtTypeArguments =
- _helper.buildDartTypeArguments(typeArguments);
+ builtTypeArguments = _helper.buildDartTypeArguments(
+ typeArguments,
+ allowPotentiallyConstantType: true);
}
if (isGenericTypedefTearOff) {
if (isProperRenameForClass(_helper.typeEnvironment,
@@ -3670,7 +3686,9 @@
if (typeArguments != null) {
assert(_forest.argumentsTypeArguments(arguments).isEmpty);
_forest.argumentsSetTypeArguments(
- arguments, _helper.buildDartTypeArguments(typeArguments));
+ arguments,
+ _helper.buildDartTypeArguments(typeArguments,
+ allowPotentiallyConstantType: false));
}
return buildError(arguments, kind: UnresolvedKind.Constructor);
}
@@ -4145,7 +4163,8 @@
@override
TypeBuilder buildTypeWithResolvedArguments(
- NullabilityBuilder nullabilityBuilder, List<UnresolvedType>? arguments) {
+ NullabilityBuilder nullabilityBuilder, List<UnresolvedType>? arguments,
+ {required bool allowPotentiallyConstantType}) {
Template<Message Function(String, String)> template = isUnresolved
? templateUnresolvedPrefixInTypeAnnotation
: templateNotAPrefixInTypeAnnotation;
@@ -4269,7 +4288,8 @@
@override
TypeBuilder buildTypeWithResolvedArguments(
- NullabilityBuilder nullabilityBuilder, List<UnresolvedType>? arguments) {
+ NullabilityBuilder nullabilityBuilder, List<UnresolvedType>? arguments,
+ {required bool allowPotentiallyConstantType}) {
// TODO(johnniwinther): Could we use a FixedTypeBuilder(InvalidType()) here?
NamedTypeBuilder result = new NamedTypeBuilder(
token.lexeme,
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart
index c80be43..96e8b7f 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart
@@ -48,9 +48,6 @@
Member? lookupInstanceMember(Name name, {bool isSetter, bool isSuper});
- /// `true` if we are in the type of an as expression.
- bool get inIsOrAsOperatorType;
-
bool get enableExtensionTypesInLibrary;
bool get enableConstFunctionsInLibrary;
@@ -125,9 +122,8 @@
TypeDeclarationBuilder? typeAliasBuilder,
required UnresolvedKind unresolvedKind});
- UnresolvedType validateTypeUse(UnresolvedType unresolved,
- {required bool nonInstanceAccessIsError,
- required bool allowPotentiallyConstantType});
+ UnresolvedType validateTypeVariableUse(UnresolvedType unresolved,
+ {required bool allowPotentiallyConstantType});
void addProblemErrorIfConst(Message message, int charOffset, int length);
@@ -150,12 +146,13 @@
Arguments arguments, Expression expression);
DartType buildDartType(UnresolvedType unresolvedType,
- {bool nonInstanceAccessIsError: false});
+ {required bool allowPotentiallyConstantType});
DartType buildTypeLiteralDartType(UnresolvedType unresolvedType,
- {bool nonInstanceAccessIsError});
+ {required bool allowPotentiallyConstantType});
- List<DartType> buildDartTypeArguments(List<UnresolvedType>? unresolvedTypes);
+ List<DartType> buildDartTypeArguments(List<UnresolvedType>? unresolvedTypes,
+ {required bool allowPotentiallyConstantType});
void reportDuplicatedDeclaration(
Builder existing, String name, int charOffset);
diff --git a/pkg/front_end/lib/src/fasta/source/value_kinds.dart b/pkg/front_end/lib/src/fasta/source/value_kinds.dart
index 85426fc..2c88740 100644
--- a/pkg/front_end/lib/src/fasta/source/value_kinds.dart
+++ b/pkg/front_end/lib/src/fasta/source/value_kinds.dart
@@ -108,7 +108,7 @@
static const ValueKind TokenOrNull =
const SingleValueKind<type.Token>(NullValue.Token);
static const ValueKind TypeOrNull =
- const SingleValueKind<type.UnresolvedType>(NullValue.Type);
+ const SingleValueKind<type.UnresolvedType>(NullValue.UnresolvedType);
static const ValueKind TypeArguments =
const SingleValueKind<List<type.UnresolvedType>>();
static const ValueKind TypeArgumentsOrNull =
@@ -116,7 +116,7 @@
static const ValueKind TypeBuilder =
const SingleValueKind<type.TypeBuilder>();
static const ValueKind TypeBuilderOrNull =
- const SingleValueKind<type.TypeBuilder>(NullValue.Type);
+ const SingleValueKind<type.TypeBuilder>(NullValue.UnresolvedType);
static const ValueKind TypeBuilderListOrNull =
const SingleValueKind<List<type.TypeBuilder>>(NullValue.TypeBuilderList);
static const ValueKind TypeVariableListOrNull =
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index 1197e88..69249ea 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -935,6 +935,7 @@
printer
printf
println
+prioritization
proc
producers
product
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue47154c.dart b/pkg/front_end/testcases/constructor_tearoffs/issue47154c.dart
new file mode 100644
index 0000000..26bd054
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue47154c.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// A potentially constant type expression is supported for `as` (and `is`)
+class A<X> {
+ final List<X> x;
+ const A(x) : x = x is List<X> ? x : x as List<X>;
+}
+
+void m<X>(X x) {}
+
+// Generic function instantiation to a type parameter is supported implicitly.
+class B<X> {
+ final void Function(X) f;
+ const B() : f = m;
+}
+
+// But it is not supported explicitly.
+class C<X> {
+ final f;
+ const C() : f = m<X>; // Error, but should be accepted.
+}
+
+void main() {
+ const A<int>(<int>[1]); // OK.
+ const b = B<String>(); // OK.
+ print(b.f.runtimeType); // OK: 'String => void'.
+ const c = C<
+ String>(); // Compile-time error in `C`, but should be accepted when it works.
+ print(c.f.runtimeType); // (Never executed, so we don't know).
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue47154c.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/issue47154c.dart.strong.expect
new file mode 100644
index 0000000..f4cf0df
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue47154c.dart.strong.expect
@@ -0,0 +1,46 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/ {
+ final field core::List<self::A::X%> x;
+ const constructor •(dynamic x) → self::A<self::A::X%>
+ : self::A::x = x is{ForNonNullableByDefault} core::List<self::A::X%> ?{core::List<self::A::X%>} x{core::List<self::A::X%>} : x as{ForNonNullableByDefault} core::List<self::A::X%>, super core::Object::•()
+ ;
+}
+class B<X extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/ {
+ final field (self::B::X%) → void f;
+ const constructor •() → self::B<self::B::X%>
+ : self::B::f = #C1<self::B::X%>, super core::Object::•()
+ ;
+}
+class C<X extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/ {
+ final field dynamic f;
+ const constructor •() → self::C<self::C::X%>
+ : self::C::f = #C1<self::C::X%>, super core::Object::•()
+ ;
+}
+static method m<X extends core::Object? = dynamic>(self::m::X% x) → void {}
+static method main() → void {
+ #C4;
+ core::print((#C6.{self::B::f}{(core::String) → void} as{TypeError,CovarianceCheck,ForNonNullableByDefault} (core::String) → void).{core::Object::runtimeType}{core::Type});
+ core::print(#C7.{self::C::f}{dynamic}.{core::Object::runtimeType}{core::Type});
+}
+
+constants {
+ #C1 = static-tearoff self::m
+ #C2 = 1
+ #C3 = <core::int>[#C2]
+ #C4 = self::A<core::int> {x:#C3}
+ #C5 = instantiation self::m <core::String>
+ #C6 = self::B<core::String> {f:#C5}
+ #C7 = self::C<core::String> {f:#C5}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///issue47154c.dart:
+- A. (from org-dartlang-testcase:///issue47154c.dart:8:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- B. (from org-dartlang-testcase:///issue47154c.dart:16:9)
+- C. (from org-dartlang-testcase:///issue47154c.dart:22:9)
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue47154c.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/issue47154c.dart.strong.transformed.expect
new file mode 100644
index 0000000..f4cf0df
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue47154c.dart.strong.transformed.expect
@@ -0,0 +1,46 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/ {
+ final field core::List<self::A::X%> x;
+ const constructor •(dynamic x) → self::A<self::A::X%>
+ : self::A::x = x is{ForNonNullableByDefault} core::List<self::A::X%> ?{core::List<self::A::X%>} x{core::List<self::A::X%>} : x as{ForNonNullableByDefault} core::List<self::A::X%>, super core::Object::•()
+ ;
+}
+class B<X extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/ {
+ final field (self::B::X%) → void f;
+ const constructor •() → self::B<self::B::X%>
+ : self::B::f = #C1<self::B::X%>, super core::Object::•()
+ ;
+}
+class C<X extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/ {
+ final field dynamic f;
+ const constructor •() → self::C<self::C::X%>
+ : self::C::f = #C1<self::C::X%>, super core::Object::•()
+ ;
+}
+static method m<X extends core::Object? = dynamic>(self::m::X% x) → void {}
+static method main() → void {
+ #C4;
+ core::print((#C6.{self::B::f}{(core::String) → void} as{TypeError,CovarianceCheck,ForNonNullableByDefault} (core::String) → void).{core::Object::runtimeType}{core::Type});
+ core::print(#C7.{self::C::f}{dynamic}.{core::Object::runtimeType}{core::Type});
+}
+
+constants {
+ #C1 = static-tearoff self::m
+ #C2 = 1
+ #C3 = <core::int>[#C2]
+ #C4 = self::A<core::int> {x:#C3}
+ #C5 = instantiation self::m <core::String>
+ #C6 = self::B<core::String> {f:#C5}
+ #C7 = self::C<core::String> {f:#C5}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///issue47154c.dart:
+- A. (from org-dartlang-testcase:///issue47154c.dart:8:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- B. (from org-dartlang-testcase:///issue47154c.dart:16:9)
+- C. (from org-dartlang-testcase:///issue47154c.dart:22:9)
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue47154c.dart.textual_outline.expect b/pkg/front_end/testcases/constructor_tearoffs/issue47154c.dart.textual_outline.expect
new file mode 100644
index 0000000..31e8d36
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue47154c.dart.textual_outline.expect
@@ -0,0 +1,18 @@
+class A<X> {
+ final List<X> x;
+ const A(x) : x = x is List<X> ? x : x as List<X>;
+}
+
+void m<X>(X x) {}
+
+class B<X> {
+ final void Function(X) f;
+ const B() : f = m;
+}
+
+class C<X> {
+ final f;
+ const C() : f = m<X>;
+}
+
+void main() {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue47154c.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/constructor_tearoffs/issue47154c.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..1a39222
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue47154c.dart.textual_outline_modelled.expect
@@ -0,0 +1,17 @@
+class A<X> {
+ const A(x) : x = x is List<X> ? x : x as List<X>;
+ final List<X> x;
+}
+
+class B<X> {
+ const B() : f = m;
+ final void Function(X) f;
+}
+
+class C<X> {
+ const C() : f = m<X>;
+ final f;
+}
+
+void m<X>(X x) {}
+void main() {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue47154c.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/issue47154c.dart.weak.expect
new file mode 100644
index 0000000..78d6475
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue47154c.dart.weak.expect
@@ -0,0 +1,46 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/ {
+ final field core::List<self::A::X%> x;
+ const constructor •(dynamic x) → self::A<self::A::X%>
+ : self::A::x = x is{ForNonNullableByDefault} core::List<self::A::X%> ?{core::List<self::A::X%>} x{core::List<self::A::X%>} : x as{ForNonNullableByDefault} core::List<self::A::X%>, super core::Object::•()
+ ;
+}
+class B<X extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/ {
+ final field (self::B::X%) → void f;
+ const constructor •() → self::B<self::B::X%>
+ : self::B::f = #C1<self::B::X%>, super core::Object::•()
+ ;
+}
+class C<X extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/ {
+ final field dynamic f;
+ const constructor •() → self::C<self::C::X%>
+ : self::C::f = #C1<self::C::X%>, super core::Object::•()
+ ;
+}
+static method m<X extends core::Object? = dynamic>(self::m::X% x) → void {}
+static method main() → void {
+ #C4;
+ core::print((#C6.{self::B::f}{(core::String) → void} as{TypeError,CovarianceCheck,ForNonNullableByDefault} (core::String) → void).{core::Object::runtimeType}{core::Type});
+ core::print(#C7.{self::C::f}{dynamic}.{core::Object::runtimeType}{core::Type});
+}
+
+constants {
+ #C1 = static-tearoff self::m
+ #C2 = 1
+ #C3 = <core::int*>[#C2]
+ #C4 = self::A<core::int*> {x:#C3}
+ #C5 = instantiation self::m <core::String*>
+ #C6 = self::B<core::String*> {f:#C5}
+ #C7 = self::C<core::String*> {f:#C5}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///issue47154c.dart:
+- A. (from org-dartlang-testcase:///issue47154c.dart:8:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- B. (from org-dartlang-testcase:///issue47154c.dart:16:9)
+- C. (from org-dartlang-testcase:///issue47154c.dart:22:9)
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue47154c.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/issue47154c.dart.weak.outline.expect
new file mode 100644
index 0000000..3c229cc
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue47154c.dart.weak.outline.expect
@@ -0,0 +1,32 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/ {
+ final field core::List<self::A::X%> x;
+ const constructor •(dynamic x) → self::A<self::A::X%>
+ : self::A::x = x is{ForNonNullableByDefault} core::List<self::A::X%> ?{core::List<self::A::X%>} x{core::List<self::A::X%>} : x as{ForNonNullableByDefault} core::List<self::A::X%>, super core::Object::•()
+ ;
+}
+class B<X extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/ {
+ final field (self::B::X%) → void f;
+ const constructor •() → self::B<self::B::X%>
+ : self::B::f = self::m<self::B::X%>, super core::Object::•()
+ ;
+}
+class C<X extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/ {
+ final field dynamic f;
+ const constructor •() → self::C<self::C::X%>
+ : self::C::f = self::m<self::C::X%>, super core::Object::•()
+ ;
+}
+static method m<X extends core::Object? = dynamic>(self::m::X% x) → void
+ ;
+static method main() → void
+ ;
+
+
+Extra constant evaluation status:
+Evaluated: StaticTearOff @ org-dartlang-testcase:///issue47154c.dart:16:19 -> StaticTearOffConstant(m)
+Evaluated: StaticTearOff @ org-dartlang-testcase:///issue47154c.dart:22:19 -> StaticTearOffConstant(m)
+Extra constant evaluation: evaluated: 10, effectively constant: 2
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue47154c.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/issue47154c.dart.weak.transformed.expect
new file mode 100644
index 0000000..78d6475
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue47154c.dart.weak.transformed.expect
@@ -0,0 +1,46 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/ {
+ final field core::List<self::A::X%> x;
+ const constructor •(dynamic x) → self::A<self::A::X%>
+ : self::A::x = x is{ForNonNullableByDefault} core::List<self::A::X%> ?{core::List<self::A::X%>} x{core::List<self::A::X%>} : x as{ForNonNullableByDefault} core::List<self::A::X%>, super core::Object::•()
+ ;
+}
+class B<X extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/ {
+ final field (self::B::X%) → void f;
+ const constructor •() → self::B<self::B::X%>
+ : self::B::f = #C1<self::B::X%>, super core::Object::•()
+ ;
+}
+class C<X extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/ {
+ final field dynamic f;
+ const constructor •() → self::C<self::C::X%>
+ : self::C::f = #C1<self::C::X%>, super core::Object::•()
+ ;
+}
+static method m<X extends core::Object? = dynamic>(self::m::X% x) → void {}
+static method main() → void {
+ #C4;
+ core::print((#C6.{self::B::f}{(core::String) → void} as{TypeError,CovarianceCheck,ForNonNullableByDefault} (core::String) → void).{core::Object::runtimeType}{core::Type});
+ core::print(#C7.{self::C::f}{dynamic}.{core::Object::runtimeType}{core::Type});
+}
+
+constants {
+ #C1 = static-tearoff self::m
+ #C2 = 1
+ #C3 = <core::int*>[#C2]
+ #C4 = self::A<core::int*> {x:#C3}
+ #C5 = instantiation self::m <core::String*>
+ #C6 = self::B<core::String*> {f:#C5}
+ #C7 = self::C<core::String*> {f:#C5}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///issue47154c.dart:
+- A. (from org-dartlang-testcase:///issue47154c.dart:8:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- B. (from org-dartlang-testcase:///issue47154c.dart:16:9)
+- C. (from org-dartlang-testcase:///issue47154c.dart:22:9)
diff --git a/pkg/front_end/testcases/general/constants/potentially_constant_type.dart b/pkg/front_end/testcases/general/constants/potentially_constant_type.dart
new file mode 100644
index 0000000..9cb3ac2
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/potentially_constant_type.dart
@@ -0,0 +1,75 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Pre-nnbd language version
+// @dart=2.9
+
+import 'potentially_constant_type_lib1.dart';
+import 'potentially_constant_type_lib2.dart';
+
+T id<T>(T t) => t;
+
+class Class<T> {
+ final field1;
+ final field5;
+ final field6;
+ final field7;
+ final field8;
+ final field9;
+ final field10;
+ final field11;
+ final field15;
+
+ const Class(o)
+ // Potentially constant context:
+ : field1 = T,
+ field5 = <T>[],
+ field6 = <T>{},
+ field7 = <T, T>{},
+ field8 = o is T,
+ field9 = o is Class<T>,
+ field10 = o as T,
+ field11 = o as Class<T>,
+ field15 = <Class<T>>[];
+
+ void method() {
+ const o = null;
+
+ // Required constant context:
+ const local1 = T;
+ const local5 = <T>[];
+ const local6 = <T>{};
+ const local7 = <T, T>{};
+ const local8 = o is T;
+ const local9 = o is Class<T>;
+ const local10 = o as T;
+ const local11 = o as Class<T>;
+ const local15 = <Class<T>>[];
+ const List<T> listOfNever = []; // ok
+
+ print(local1);
+ print(local5);
+ print(local6);
+ print(local7);
+ print(local8);
+ print(local9);
+ print(local10);
+ print(local11);
+ print(local15);
+ print(listOfNever);
+
+ // Inferred constant context:
+ print(const [T]);
+ print(const [<T>[]]);
+ print(const [<T>{}]);
+ print(const [<T, T>{}]);
+ print(const [o is T]);
+ print(const [o is Class<T>]);
+ print(const [o as T]);
+ print(const [o as Class<T>]);
+ print(const [<Class<T>>[]]);
+ }
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/constants/potentially_constant_type.dart.textual_outline.expect b/pkg/front_end/testcases/general/constants/potentially_constant_type.dart.textual_outline.expect
new file mode 100644
index 0000000..94d8409
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/potentially_constant_type.dart.textual_outline.expect
@@ -0,0 +1,30 @@
+// @dart = 2.9
+import 'potentially_constant_type_lib1.dart';
+import 'potentially_constant_type_lib2.dart';
+
+T id<T>(T t) => t;
+
+class Class<T> {
+ final field1;
+ final field5;
+ final field6;
+ final field7;
+ final field8;
+ final field9;
+ final field10;
+ final field11;
+ final field15;
+ const Class(o)
+ : field1 = T,
+ field5 = <T>[],
+ field6 = <T>{},
+ field7 = <T, T>{},
+ field8 = o is T,
+ field9 = o is Class<T>,
+ field10 = o as T,
+ field11 = o as Class<T>,
+ field15 = <Class<T>>[];
+ void method() {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/constants/potentially_constant_type.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/constants/potentially_constant_type.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..80bc031
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/potentially_constant_type.dart.textual_outline_modelled.expect
@@ -0,0 +1,30 @@
+// @dart = 2.9
+import 'potentially_constant_type_lib1.dart';
+import 'potentially_constant_type_lib2.dart';
+
+T id<T>(T t) => t;
+
+class Class<T> {
+ const Class(o)
+ : field1 = T,
+ field5 = <T>[],
+ field6 = <T>{},
+ field7 = <T, T>{},
+ field8 = o is T,
+ field9 = o is Class<T>,
+ field10 = o as T,
+ field11 = o as Class<T>,
+ field15 = <Class<T>>[];
+ final field1;
+ final field10;
+ final field11;
+ final field15;
+ final field5;
+ final field6;
+ final field7;
+ final field8;
+ final field9;
+ void method() {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/constants/potentially_constant_type.dart.weak.expect b/pkg/front_end/testcases/general/constants/potentially_constant_type.dart.weak.expect
new file mode 100644
index 0000000..e7b3e08
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/potentially_constant_type.dart.weak.expect
@@ -0,0 +1,666 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:26:18: Error: Type variables can't be used as constants.
+// : field1 = T,
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:27:21: Error: Constant expression expected.
+// Try inserting 'const'.
+// field5 = <T>[],
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:27:19: Error: Type variables can't be used as constants.
+// field5 = <T>[],
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:28:21: Error: Constant expression expected.
+// Try inserting 'const'.
+// field6 = <T>{},
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:28:19: Error: Type variables can't be used as constants.
+// field6 = <T>{},
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:29:24: Error: Constant expression expected.
+// Try inserting 'const'.
+// field7 = <T, T>{},
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:29:19: Error: Type variables can't be used as constants.
+// field7 = <T, T>{},
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:29:22: Error: Type variables can't be used as constants.
+// field7 = <T, T>{},
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:30:23: Error: Type variables can't be used as constants.
+// field8 = o is T,
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:31:29: Error: Type variables can't be used as constants.
+// field9 = o is Class<T>,
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:32:24: Error: Type variables can't be used as constants.
+// field10 = o as T,
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:33:30: Error: Type variables can't be used as constants.
+// field11 = o as Class<T>,
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:34:26: Error: Type variables can't be used as constants.
+// field15 = <Class<T>>[];
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:34:29: Error: Constant expression expected.
+// Try inserting 'const'.
+// field15 = <Class<T>>[];
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:40:20: Error: Type variables can't be used as constants.
+// const local1 = T;
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:41:21: Error: Type variables can't be used as constants.
+// const local5 = <T>[];
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:42:21: Error: Type variables can't be used as constants.
+// const local6 = <T>{};
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:43:21: Error: Type variables can't be used as constants.
+// const local7 = <T, T>{};
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:43:24: Error: Type variables can't be used as constants.
+// const local7 = <T, T>{};
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:44:25: Error: Type variables can't be used as constants.
+// const local8 = o is T;
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:45:31: Error: Type variables can't be used as constants.
+// const local9 = o is Class<T>;
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:46:26: Error: Type variables can't be used as constants.
+// const local10 = o as T;
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:47:32: Error: Type variables can't be used as constants.
+// const local11 = o as Class<T>;
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:48:28: Error: Type variables can't be used as constants.
+// const local15 = <Class<T>>[];
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:63:18: Error: Type variables can't be used as constants.
+// print(const [T]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:64:19: Error: Type variables can't be used as constants.
+// print(const [<T>[]]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:65:19: Error: Type variables can't be used as constants.
+// print(const [<T>{}]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:66:19: Error: Type variables can't be used as constants.
+// print(const [<T, T>{}]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:66:22: Error: Type variables can't be used as constants.
+// print(const [<T, T>{}]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:67:23: Error: Type variables can't be used as constants.
+// print(const [o is T]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:68:29: Error: Type variables can't be used as constants.
+// print(const [o is Class<T>]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:69:23: Error: Type variables can't be used as constants.
+// print(const [o as T]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:70:29: Error: Type variables can't be used as constants.
+// print(const [o as Class<T>]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:71:25: Error: Type variables can't be used as constants.
+// print(const [<Class<T>>[]]);
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///potentially_constant_type_lib1.dart";
+import "org-dartlang-testcase:///potentially_constant_type_lib2.dart";
+
+class Class<T extends core::Object* = dynamic> extends core::Object /*hasConstConstructor*/ {
+ final field dynamic field1;
+ final field dynamic field5;
+ final field dynamic field6;
+ final field dynamic field7;
+ final field dynamic field8;
+ final field dynamic field9;
+ final field dynamic field10;
+ final field dynamic field11;
+ final field dynamic field15;
+ const constructor •(dynamic o) → self::Class<self::Class::T*>*
+ : self::Class::field1 = #C1, self::Class::field5 = #C2, self::Class::field6 = #C3, self::Class::field7 = #C4, self::Class::field8 = o is invalid-type, self::Class::field9 = o is self::Class<invalid-type>*, self::Class::field10 = o as invalid-type, self::Class::field11 = o as self::Class<invalid-type>*, self::Class::field15 = #C5, super core::Object::•()
+ ;
+ method method() → void {
+ core::print(#C1);
+ core::print(#C2);
+ core::print(#C3);
+ core::print(#C4);
+ core::print(#C6);
+ core::print(#C7);
+ core::print(#C8);
+ core::print(#C8);
+ core::print(#C5);
+ core::print(#C9);
+ core::print(#C10);
+ core::print(#C11);
+ core::print(#C12);
+ core::print(#C13);
+ core::print(#C14);
+ core::print(#C15);
+ core::print(#C16);
+ core::print(#C17);
+ core::print(#C18);
+ }
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method id<T extends core::Object* = dynamic>(self::id::T* t) → self::id::T*
+ return t;
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:23:18: Error: Type variables can't be used as constants.
+// : field1 = T,
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:24:21: Error: Constant expression expected.
+// Try inserting 'const'.
+// field5 = <T>[],
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:24:19: Error: Type variables can't be used as constants.
+// field5 = <T>[],
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:25:21: Error: Constant expression expected.
+// Try inserting 'const'.
+// field6 = <T>{},
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:25:19: Error: Type variables can't be used as constants.
+// field6 = <T>{},
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:26:24: Error: Constant expression expected.
+// Try inserting 'const'.
+// field7 = <T, T>{},
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:26:19: Error: Type variables can't be used as constants.
+// field7 = <T, T>{},
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:26:22: Error: Type variables can't be used as constants.
+// field7 = <T, T>{},
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:31:26: Error: Type variables can't be used as constants.
+// field15 = <Class<T>>[];
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:31:29: Error: Constant expression expected.
+// Try inserting 'const'.
+// field15 = <Class<T>>[];
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:37:20: Error: Type variables can't be used as constants.
+// const local1 = T;
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:38:21: Error: Type variables can't be used as constants.
+// const local5 = <T>[];
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:39:21: Error: Type variables can't be used as constants.
+// const local6 = <T>{};
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:40:21: Error: Type variables can't be used as constants.
+// const local7 = <T, T>{};
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:40:24: Error: Type variables can't be used as constants.
+// const local7 = <T, T>{};
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:41:25: Error: Type variables can't be used as constants.
+// const local8 = o is T;
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:42:31: Error: Type variables can't be used as constants.
+// const local9 = o is Class<T>;
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:43:26: Error: Type variables can't be used as constants.
+// const local10 = o as T;
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:44:32: Error: Type variables can't be used as constants.
+// const local11 = o as Class<T>;
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:45:28: Error: Type variables can't be used as constants.
+// const local15 = <Class<T>>[];
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:60:18: Error: Type variables can't be used as constants.
+// print(const [T]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:61:19: Error: Type variables can't be used as constants.
+// print(const [<T>[]]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:62:19: Error: Type variables can't be used as constants.
+// print(const [<T>{}]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:63:19: Error: Type variables can't be used as constants.
+// print(const [<T, T>{}]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:63:22: Error: Type variables can't be used as constants.
+// print(const [<T, T>{}]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:64:23: Error: Type variables can't be used as constants.
+// print(const [o is T]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:65:29: Error: Type variables can't be used as constants.
+// print(const [o is Class<T>]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:66:23: Error: Type variables can't be used as constants.
+// print(const [o as T]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:67:29: Error: Type variables can't be used as constants.
+// print(const [o as Class<T>]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:68:25: Error: Type variables can't be used as constants.
+// print(const [<Class<T>>[]]);
+// ^
+//
+import self as self2;
+import "dart:core" as core;
+
+class Class<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/ {
+ final field dynamic field1;
+ final field dynamic field5;
+ final field dynamic field6;
+ final field dynamic field7;
+ final field dynamic field8;
+ final field dynamic field9;
+ final field dynamic field10;
+ final field dynamic field11;
+ final field dynamic field15;
+ const constructor •(dynamic o) → self2::Class<self2::Class::T%>
+ : self2::Class::field1 = #C1, self2::Class::field5 = #C2, self2::Class::field6 = #C3, self2::Class::field7 = #C4, self2::Class::field8 = o is{ForNonNullableByDefault} self2::Class::T%, self2::Class::field9 = o is{ForNonNullableByDefault} self2::Class<self2::Class::T%>, self2::Class::field10 = o as{ForNonNullableByDefault} self2::Class::T%, self2::Class::field11 = o{self2::Class::T%} as{ForNonNullableByDefault} self2::Class<self2::Class::T%>, self2::Class::field15 = #C19, super core::Object::•()
+ ;
+ method method() → void {
+ core::print(#C1);
+ core::print(#C2);
+ core::print(#C3);
+ core::print(#C4);
+ core::print(#C6);
+ core::print(#C7);
+ core::print(#C8);
+ core::print(#C8);
+ core::print(#C19);
+ core::print(#C20);
+ core::print(#C10);
+ core::print(#C11);
+ core::print(#C12);
+ core::print(#C13);
+ core::print(#C14);
+ core::print(#C15);
+ core::print(#C21);
+ core::print(#C22);
+ core::print(#C23);
+ }
+}
+static method id<T extends core::Object? = dynamic>(self2::id::T% t) → self2::id::T%
+ return t;
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:34:21: Error: Constant expression expected.
+// Try inserting 'const'.
+// field5 = <T>[],
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:34:19: Error: Type variables can't be used as constants.
+// field5 = <T>[],
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:35:21: Error: Constant expression expected.
+// Try inserting 'const'.
+// field6 = <T>{},
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:35:19: Error: Type variables can't be used as constants.
+// field6 = <T>{},
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:36:24: Error: Constant expression expected.
+// Try inserting 'const'.
+// field7 = <T, T>{},
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:36:19: Error: Type variables can't be used as constants.
+// field7 = <T, T>{},
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:36:22: Error: Type variables can't be used as constants.
+// field7 = <T, T>{},
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:44:29: Error: Constant expression expected.
+// Try inserting 'const'.
+// field15 = <Class<T>>[],
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:44:26: Error: Type variables can't be used as constants.
+// field15 = <Class<T>>[],
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:51:20: Error: Type variables can't be used as constants.
+// const local1 = T;
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:52:26: Error: Type variables can't be used as constants.
+// const local2 = Class<T>;
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:53:23: Error: Type variables can't be used as constants.
+// const local3 = id<T>;
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:54:25: Error: Type variables can't be used as constants.
+// const local4 = (id)<T>;
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:55:21: Error: Type variables can't be used as constants.
+// const local5 = <T>[];
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:56:21: Error: Type variables can't be used as constants.
+// const local6 = <T>{};
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:57:21: Error: Type variables can't be used as constants.
+// const local7 = <T, T>{};
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:57:24: Error: Type variables can't be used as constants.
+// const local7 = <T, T>{};
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:58:25: Error: Type variables can't be used as constants.
+// const local8 = o is T;
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:59:31: Error: Type variables can't be used as constants.
+// const local9 = o is Class<T>;
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:60:26: Error: Type variables can't be used as constants.
+// const local10 = o as T;
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:61:32: Error: Type variables can't be used as constants.
+// const local11 = o as Class<T>;
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:62:27: Error: Type variables can't be used as constants.
+// const local12 = Class<T>.new;
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:63:23: Error: Type variables can't be used as constants.
+// const local13 = F<T, T>.new;
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:63:26: Error: Type variables can't be used as constants.
+// const local13 = F<T, T>.new;
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:64:30: Error: Type variables can't be used as constants.
+// const local14 = id<Class<T>>;
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:65:28: Error: Type variables can't be used as constants.
+// const local15 = <Class<T>>[];
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:66:23: Error: Type variables can't be used as constants.
+// const local16 = G<T>.new;
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:88:18: Error: Type variables can't be used as constants.
+// print(const [T]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:89:24: Error: Type variables can't be used as constants.
+// print(const [Class<T>]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:90:21: Error: Type variables can't be used as constants.
+// print(const [id<T>]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:91:23: Error: Type variables can't be used as constants.
+// print(const [(id)<T>]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:92:19: Error: Type variables can't be used as constants.
+// print(const [<T>[]]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:93:19: Error: Type variables can't be used as constants.
+// print(const [<T>{}]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:94:19: Error: Type variables can't be used as constants.
+// print(const [<T, T>{}]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:94:22: Error: Type variables can't be used as constants.
+// print(const [<T, T>{}]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:95:23: Error: Type variables can't be used as constants.
+// print(const [o is T]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:96:29: Error: Type variables can't be used as constants.
+// print(const [o is Class<T>]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:97:23: Error: Type variables can't be used as constants.
+// print(const [o as T]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:98:29: Error: Type variables can't be used as constants.
+// print(const [o as Class<T>]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:99:24: Error: Type variables can't be used as constants.
+// print(const [Class<T>.new]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:100:20: Error: Type variables can't be used as constants.
+// print(const [F<T, T>.new]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:100:23: Error: Type variables can't be used as constants.
+// print(const [F<T, T>.new]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:101:27: Error: Type variables can't be used as constants.
+// print(const [id<Class<T>>]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:102:25: Error: Type variables can't be used as constants.
+// print(const [<Class<T>>[]]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:103:20: Error: Type variables can't be used as constants.
+// print(const [G<T>.new]);
+// ^
+//
+import self as self3;
+import "dart:core" as core;
+
+typedef F<X extends core::Object? = dynamic, unrelated Y extends core::Object? = dynamic> = self3::Class<X%>;
+typedef G<unrelated X extends core::Object? = dynamic> = self3::Class<core::int>;
+class Class<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/ {
+ final field dynamic field1;
+ final field dynamic field2;
+ final field dynamic field3;
+ final field dynamic field4;
+ final field dynamic field5;
+ final field dynamic field6;
+ final field dynamic field7;
+ final field dynamic field8;
+ final field dynamic field9;
+ final field dynamic field10;
+ final field dynamic field11;
+ final field dynamic field12;
+ final field dynamic field13;
+ final field dynamic field14;
+ final field dynamic field15;
+ final field dynamic field16;
+ const constructor •(dynamic o) → self3::Class<self3::Class::T%>
+ : self3::Class::field1 = self3::Class::T%, self3::Class::field2 = self3::Class<self3::Class::T%>, self3::Class::field3 = #C24<self3::Class::T%>, self3::Class::field4 = #C24<self3::Class::T%>, self3::Class::field5 = #C2, self3::Class::field6 = #C3, self3::Class::field7 = #C4, self3::Class::field8 = o is{ForNonNullableByDefault} self3::Class::T%, self3::Class::field9 = o is{ForNonNullableByDefault} self3::Class<self3::Class::T%>, self3::Class::field10 = o as{ForNonNullableByDefault} self3::Class::T%, self3::Class::field11 = o{self3::Class::T%} as{ForNonNullableByDefault} self3::Class<self3::Class::T%>, self3::Class::field12 = #C25<self3::Class::T%>, self3::Class::field13 = #C25<self3::Class::T%>, self3::Class::field14 = #C24<self3::Class<self3::Class::T%>>, self3::Class::field15 = #C26, self3::Class::field16 = #C27, super core::Object::•()
+ ;
+ method method() → void {
+ core::print(#C1);
+ core::print(#C28);
+ core::print(#C29);
+ core::print(#C29);
+ core::print(#C2);
+ core::print(#C3);
+ core::print(#C4);
+ core::print(#C6);
+ core::print(#C7);
+ core::print(#C8);
+ core::print(#C8);
+ core::print(#C30);
+ core::print(#C30);
+ core::print(#C31);
+ core::print(#C26);
+ core::print(#C27);
+ core::print(#C20);
+ core::print(#C10);
+ core::print(#C32);
+ core::print(#C33);
+ core::print(#C33);
+ core::print(#C11);
+ core::print(#C12);
+ core::print(#C13);
+ core::print(#C14);
+ core::print(#C15);
+ core::print(#C21);
+ core::print(#C34);
+ core::print(#C35);
+ core::print(#C35);
+ core::print(#C36);
+ core::print(#C37);
+ core::print(#C38);
+ }
+}
+static method id<T extends core::Object? = dynamic>(self3::id::T% t) → self3::id::T%
+ return t;
+static method main() → dynamic {}
+static method _#F#new#tearOff<X extends core::Object? = dynamic, unrelated Y extends core::Object? = dynamic>(dynamic o) → self3::Class<self3::_#F#new#tearOff::X%>
+ return new self3::Class::•<self3::_#F#new#tearOff::X%>(o);
+static method _#G#new#tearOff<unrelated X extends core::Object? = dynamic>(dynamic o) → self3::Class<core::int>
+ return new self3::Class::•<core::int>(o);
+
+constants {
+ #C1 = TypeLiteralConstant(invalid-type)
+ #C2 = <invalid-type>[]
+ #C3 = <invalid-type>{}
+ #C4 = <invalid-type, invalid-type>{)
+ #C5 = <self::Class<invalid-type>*>[]
+ #C6 = true
+ #C7 = false
+ #C8 = null
+ #C9 = <Null>[]
+ #C10 = <core::Type*>[#C1]
+ #C11 = <core::List<invalid-type>*>[#C2]
+ #C12 = <core::Set<invalid-type>*>[#C3]
+ #C13 = <core::Map<invalid-type, invalid-type>*>[#C4]
+ #C14 = <core::bool*>[#C6]
+ #C15 = <core::bool*>[#C7]
+ #C16 = <invalid-type>[#C8]
+ #C17 = <self::Class<invalid-type>*>[#C8]
+ #C18 = <core::List<self::Class<invalid-type>*>*>[#C5]
+ #C19 = <self2::Class<invalid-type>*>[]
+ #C20 = <Never*>[]
+ #C21 = <dynamic>[#C8]
+ #C22 = <self2::Class<invalid-type>*>[#C8]
+ #C23 = <core::List<self2::Class<invalid-type>*>*>[#C19]
+ #C24 = static-tearoff self3::id
+ #C25 = constructor-tearoff self3::Class::•
+ #C26 = <self3::Class<invalid-type>*>[]
+ #C27 = instantiation self3::Class::• <core::int*>
+ #C28 = TypeLiteralConstant(self3::Class<invalid-type>*)
+ #C29 = instantiation self3::id <invalid-type>
+ #C30 = instantiation self3::Class::• <invalid-type>
+ #C31 = instantiation self3::id <self3::Class<invalid-type>*>
+ #C32 = <core::Type*>[#C28]
+ #C33 = <(invalid-type) →* invalid-type>[#C29]
+ #C34 = <self3::Class<invalid-type>*>[#C8]
+ #C35 = <(dynamic) →* self3::Class<invalid-type>*>[#C30]
+ #C36 = <(self3::Class<invalid-type>*) →* self3::Class<invalid-type>*>[#C31]
+ #C37 = <core::List<self3::Class<invalid-type>*>*>[#C26]
+ #C38 = <(dynamic) →* self3::Class<core::int*>*>[#C27]
+}
diff --git a/pkg/front_end/testcases/general/constants/potentially_constant_type.dart.weak.outline.expect b/pkg/front_end/testcases/general/constants/potentially_constant_type.dart.weak.outline.expect
new file mode 100644
index 0000000..559f6ba
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/potentially_constant_type.dart.weak.outline.expect
@@ -0,0 +1,274 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:26:18: Error: Type variables can't be used as constants.
+// : field1 = T,
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:27:21: Error: Constant expression expected.
+// Try inserting 'const'.
+// field5 = <T>[],
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:27:19: Error: Type variables can't be used as constants.
+// field5 = <T>[],
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:28:21: Error: Constant expression expected.
+// Try inserting 'const'.
+// field6 = <T>{},
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:28:19: Error: Type variables can't be used as constants.
+// field6 = <T>{},
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:29:24: Error: Constant expression expected.
+// Try inserting 'const'.
+// field7 = <T, T>{},
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:29:19: Error: Type variables can't be used as constants.
+// field7 = <T, T>{},
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:29:22: Error: Type variables can't be used as constants.
+// field7 = <T, T>{},
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:30:23: Error: Type variables can't be used as constants.
+// field8 = o is T,
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:31:29: Error: Type variables can't be used as constants.
+// field9 = o is Class<T>,
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:32:24: Error: Type variables can't be used as constants.
+// field10 = o as T,
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:33:30: Error: Type variables can't be used as constants.
+// field11 = o as Class<T>,
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:34:26: Error: Type variables can't be used as constants.
+// field15 = <Class<T>>[];
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:34:29: Error: Constant expression expected.
+// Try inserting 'const'.
+// field15 = <Class<T>>[];
+// ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+import "org-dartlang-testcase:///potentially_constant_type_lib1.dart";
+import "org-dartlang-testcase:///potentially_constant_type_lib2.dart";
+
+class Class<T extends core::Object* = dynamic> extends core::Object /*hasConstConstructor*/ {
+ final field dynamic field1;
+ final field dynamic field5;
+ final field dynamic field6;
+ final field dynamic field7;
+ final field dynamic field8;
+ final field dynamic field9;
+ final field dynamic field10;
+ final field dynamic field11;
+ final field dynamic field15;
+ const constructor •(dynamic o) → self::Class<self::Class::T*>*
+ : self::Class::field1 = invalid-type, self::Class::field5 = <invalid-type>[], self::Class::field6 = block {
+ final core::Set<invalid-type>* #t1 = col::LinkedHashSet::•<invalid-type>();
+ } =>#t1, self::Class::field7 = <invalid-type, invalid-type>{}, self::Class::field8 = o is invalid-type, self::Class::field9 = o is self::Class<invalid-type>*, self::Class::field10 = o as invalid-type, self::Class::field11 = o as self::Class<invalid-type>*, self::Class::field15 = <self::Class<invalid-type>*>[], super core::Object::•()
+ ;
+ method method() → void
+ ;
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method id<T extends core::Object* = dynamic>(self::id::T* t) → self::id::T*
+ ;
+static method main() → dynamic
+ ;
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:23:18: Error: Type variables can't be used as constants.
+// : field1 = T,
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:24:21: Error: Constant expression expected.
+// Try inserting 'const'.
+// field5 = <T>[],
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:24:19: Error: Type variables can't be used as constants.
+// field5 = <T>[],
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:25:21: Error: Constant expression expected.
+// Try inserting 'const'.
+// field6 = <T>{},
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:25:19: Error: Type variables can't be used as constants.
+// field6 = <T>{},
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:26:24: Error: Constant expression expected.
+// Try inserting 'const'.
+// field7 = <T, T>{},
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:26:19: Error: Type variables can't be used as constants.
+// field7 = <T, T>{},
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:26:22: Error: Type variables can't be used as constants.
+// field7 = <T, T>{},
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:31:26: Error: Type variables can't be used as constants.
+// field15 = <Class<T>>[];
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:31:29: Error: Constant expression expected.
+// Try inserting 'const'.
+// field15 = <Class<T>>[];
+// ^
+//
+import self as self2;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+class Class<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/ {
+ final field dynamic field1;
+ final field dynamic field5;
+ final field dynamic field6;
+ final field dynamic field7;
+ final field dynamic field8;
+ final field dynamic field9;
+ final field dynamic field10;
+ final field dynamic field11;
+ final field dynamic field15;
+ const constructor •(dynamic o) → self2::Class<self2::Class::T%>
+ : self2::Class::field1 = invalid-type, self2::Class::field5 = <invalid-type>[], self2::Class::field6 = block {
+ final core::Set<invalid-type> #t2 = col::LinkedHashSet::•<invalid-type>();
+ } =>#t2, self2::Class::field7 = <invalid-type, invalid-type>{}, self2::Class::field8 = o is{ForNonNullableByDefault} self2::Class::T%, self2::Class::field9 = o is{ForNonNullableByDefault} self2::Class<self2::Class::T%>, self2::Class::field10 = o as{ForNonNullableByDefault} self2::Class::T%, self2::Class::field11 = o{self2::Class::T%} as{ForNonNullableByDefault} self2::Class<self2::Class::T%>, self2::Class::field15 = <self2::Class<invalid-type>>[], super core::Object::•()
+ ;
+ method method() → void
+ ;
+}
+static method id<T extends core::Object? = dynamic>(self2::id::T% t) → self2::id::T%
+ ;
+static method main() → dynamic
+ ;
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:34:21: Error: Constant expression expected.
+// Try inserting 'const'.
+// field5 = <T>[],
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:34:19: Error: Type variables can't be used as constants.
+// field5 = <T>[],
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:35:21: Error: Constant expression expected.
+// Try inserting 'const'.
+// field6 = <T>{},
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:35:19: Error: Type variables can't be used as constants.
+// field6 = <T>{},
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:36:24: Error: Constant expression expected.
+// Try inserting 'const'.
+// field7 = <T, T>{},
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:36:19: Error: Type variables can't be used as constants.
+// field7 = <T, T>{},
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:36:22: Error: Type variables can't be used as constants.
+// field7 = <T, T>{},
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:44:29: Error: Constant expression expected.
+// Try inserting 'const'.
+// field15 = <Class<T>>[],
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:44:26: Error: Type variables can't be used as constants.
+// field15 = <Class<T>>[],
+// ^
+//
+import self as self3;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+typedef F<X extends core::Object? = dynamic, unrelated Y extends core::Object? = dynamic> = self3::Class<X%>;
+typedef G<unrelated X extends core::Object? = dynamic> = self3::Class<core::int>;
+class Class<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/ {
+ final field dynamic field1;
+ final field dynamic field2;
+ final field dynamic field3;
+ final field dynamic field4;
+ final field dynamic field5;
+ final field dynamic field6;
+ final field dynamic field7;
+ final field dynamic field8;
+ final field dynamic field9;
+ final field dynamic field10;
+ final field dynamic field11;
+ final field dynamic field12;
+ final field dynamic field13;
+ final field dynamic field14;
+ final field dynamic field15;
+ final field dynamic field16;
+ const constructor •(dynamic o) → self3::Class<self3::Class::T%>
+ : self3::Class::field1 = self3::Class::T%, self3::Class::field2 = self3::Class<self3::Class::T%>, self3::Class::field3 = self3::id<self3::Class::T%>, self3::Class::field4 = self3::id<self3::Class::T%>, self3::Class::field5 = <invalid-type>[], self3::Class::field6 = block {
+ final core::Set<invalid-type> #t3 = col::LinkedHashSet::•<invalid-type>();
+ } =>#t3, self3::Class::field7 = <invalid-type, invalid-type>{}, self3::Class::field8 = o is{ForNonNullableByDefault} self3::Class::T%, self3::Class::field9 = o is{ForNonNullableByDefault} self3::Class<self3::Class::T%>, self3::Class::field10 = o as{ForNonNullableByDefault} self3::Class::T%, self3::Class::field11 = o{self3::Class::T%} as{ForNonNullableByDefault} self3::Class<self3::Class::T%>, self3::Class::field12 = self3::Class::•<self3::Class::T%>, self3::Class::field13 = self3::Class::•<self3::Class::T%>, self3::Class::field14 = self3::id<self3::Class<self3::Class::T%>>, self3::Class::field15 = <self3::Class<invalid-type>>[], self3::Class::field16 = self3::Class::•<core::int>, super core::Object::•()
+ ;
+ method method() → void
+ ;
+}
+static method id<T extends core::Object? = dynamic>(self3::id::T% t) → self3::id::T%
+ ;
+static method main() → dynamic
+ ;
+static method _#F#new#tearOff<X extends core::Object? = dynamic, unrelated Y extends core::Object? = dynamic>(dynamic o) → self3::Class<self3::_#F#new#tearOff::X%>
+ return new self3::Class::•<self3::_#F#new#tearOff::X%>(o);
+static method _#G#new#tearOff<unrelated X extends core::Object? = dynamic>(dynamic o) → self3::Class<core::int>
+ return new self3::Class::•<core::int>(o);
+
+
+Extra constant evaluation status:
+Evaluated: TypeLiteral @ org-dartlang-testcase:///potentially_constant_type.dart:26:18 -> TypeLiteralConstant(<invalid>)
+Evaluated: TypeLiteral @ org-dartlang-testcase:///potentially_constant_type_lib1.dart:23:18 -> TypeLiteralConstant(<invalid>)
+Evaluated: StaticTearOff @ org-dartlang-testcase:///potentially_constant_type_lib2.dart:32:18 -> StaticTearOffConstant(id)
+Evaluated: StaticTearOff @ org-dartlang-testcase:///potentially_constant_type_lib2.dart:33:19 -> StaticTearOffConstant(id)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///potentially_constant_type_lib2.dart:41:19 -> ConstructorTearOffConstant(Class.)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///potentially_constant_type_lib2.dart:42:19 -> ConstructorTearOffConstant(Class.)
+Evaluated: StaticTearOff @ org-dartlang-testcase:///potentially_constant_type_lib2.dart:43:19 -> StaticTearOffConstant(id)
+Evaluated: Instantiation @ org-dartlang-testcase:///potentially_constant_type_lib2.dart:45:19 -> InstantiationConstant(Class.<int*>)
+Extra constant evaluation: evaluated: 61, effectively constant: 8
diff --git a/pkg/front_end/testcases/general/constants/potentially_constant_type.dart.weak.transformed.expect b/pkg/front_end/testcases/general/constants/potentially_constant_type.dart.weak.transformed.expect
new file mode 100644
index 0000000..e7b3e08
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/potentially_constant_type.dart.weak.transformed.expect
@@ -0,0 +1,666 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:26:18: Error: Type variables can't be used as constants.
+// : field1 = T,
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:27:21: Error: Constant expression expected.
+// Try inserting 'const'.
+// field5 = <T>[],
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:27:19: Error: Type variables can't be used as constants.
+// field5 = <T>[],
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:28:21: Error: Constant expression expected.
+// Try inserting 'const'.
+// field6 = <T>{},
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:28:19: Error: Type variables can't be used as constants.
+// field6 = <T>{},
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:29:24: Error: Constant expression expected.
+// Try inserting 'const'.
+// field7 = <T, T>{},
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:29:19: Error: Type variables can't be used as constants.
+// field7 = <T, T>{},
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:29:22: Error: Type variables can't be used as constants.
+// field7 = <T, T>{},
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:30:23: Error: Type variables can't be used as constants.
+// field8 = o is T,
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:31:29: Error: Type variables can't be used as constants.
+// field9 = o is Class<T>,
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:32:24: Error: Type variables can't be used as constants.
+// field10 = o as T,
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:33:30: Error: Type variables can't be used as constants.
+// field11 = o as Class<T>,
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:34:26: Error: Type variables can't be used as constants.
+// field15 = <Class<T>>[];
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:34:29: Error: Constant expression expected.
+// Try inserting 'const'.
+// field15 = <Class<T>>[];
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:40:20: Error: Type variables can't be used as constants.
+// const local1 = T;
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:41:21: Error: Type variables can't be used as constants.
+// const local5 = <T>[];
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:42:21: Error: Type variables can't be used as constants.
+// const local6 = <T>{};
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:43:21: Error: Type variables can't be used as constants.
+// const local7 = <T, T>{};
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:43:24: Error: Type variables can't be used as constants.
+// const local7 = <T, T>{};
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:44:25: Error: Type variables can't be used as constants.
+// const local8 = o is T;
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:45:31: Error: Type variables can't be used as constants.
+// const local9 = o is Class<T>;
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:46:26: Error: Type variables can't be used as constants.
+// const local10 = o as T;
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:47:32: Error: Type variables can't be used as constants.
+// const local11 = o as Class<T>;
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:48:28: Error: Type variables can't be used as constants.
+// const local15 = <Class<T>>[];
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:63:18: Error: Type variables can't be used as constants.
+// print(const [T]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:64:19: Error: Type variables can't be used as constants.
+// print(const [<T>[]]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:65:19: Error: Type variables can't be used as constants.
+// print(const [<T>{}]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:66:19: Error: Type variables can't be used as constants.
+// print(const [<T, T>{}]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:66:22: Error: Type variables can't be used as constants.
+// print(const [<T, T>{}]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:67:23: Error: Type variables can't be used as constants.
+// print(const [o is T]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:68:29: Error: Type variables can't be used as constants.
+// print(const [o is Class<T>]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:69:23: Error: Type variables can't be used as constants.
+// print(const [o as T]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:70:29: Error: Type variables can't be used as constants.
+// print(const [o as Class<T>]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:71:25: Error: Type variables can't be used as constants.
+// print(const [<Class<T>>[]]);
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///potentially_constant_type_lib1.dart";
+import "org-dartlang-testcase:///potentially_constant_type_lib2.dart";
+
+class Class<T extends core::Object* = dynamic> extends core::Object /*hasConstConstructor*/ {
+ final field dynamic field1;
+ final field dynamic field5;
+ final field dynamic field6;
+ final field dynamic field7;
+ final field dynamic field8;
+ final field dynamic field9;
+ final field dynamic field10;
+ final field dynamic field11;
+ final field dynamic field15;
+ const constructor •(dynamic o) → self::Class<self::Class::T*>*
+ : self::Class::field1 = #C1, self::Class::field5 = #C2, self::Class::field6 = #C3, self::Class::field7 = #C4, self::Class::field8 = o is invalid-type, self::Class::field9 = o is self::Class<invalid-type>*, self::Class::field10 = o as invalid-type, self::Class::field11 = o as self::Class<invalid-type>*, self::Class::field15 = #C5, super core::Object::•()
+ ;
+ method method() → void {
+ core::print(#C1);
+ core::print(#C2);
+ core::print(#C3);
+ core::print(#C4);
+ core::print(#C6);
+ core::print(#C7);
+ core::print(#C8);
+ core::print(#C8);
+ core::print(#C5);
+ core::print(#C9);
+ core::print(#C10);
+ core::print(#C11);
+ core::print(#C12);
+ core::print(#C13);
+ core::print(#C14);
+ core::print(#C15);
+ core::print(#C16);
+ core::print(#C17);
+ core::print(#C18);
+ }
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method id<T extends core::Object* = dynamic>(self::id::T* t) → self::id::T*
+ return t;
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:23:18: Error: Type variables can't be used as constants.
+// : field1 = T,
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:24:21: Error: Constant expression expected.
+// Try inserting 'const'.
+// field5 = <T>[],
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:24:19: Error: Type variables can't be used as constants.
+// field5 = <T>[],
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:25:21: Error: Constant expression expected.
+// Try inserting 'const'.
+// field6 = <T>{},
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:25:19: Error: Type variables can't be used as constants.
+// field6 = <T>{},
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:26:24: Error: Constant expression expected.
+// Try inserting 'const'.
+// field7 = <T, T>{},
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:26:19: Error: Type variables can't be used as constants.
+// field7 = <T, T>{},
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:26:22: Error: Type variables can't be used as constants.
+// field7 = <T, T>{},
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:31:26: Error: Type variables can't be used as constants.
+// field15 = <Class<T>>[];
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:31:29: Error: Constant expression expected.
+// Try inserting 'const'.
+// field15 = <Class<T>>[];
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:37:20: Error: Type variables can't be used as constants.
+// const local1 = T;
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:38:21: Error: Type variables can't be used as constants.
+// const local5 = <T>[];
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:39:21: Error: Type variables can't be used as constants.
+// const local6 = <T>{};
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:40:21: Error: Type variables can't be used as constants.
+// const local7 = <T, T>{};
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:40:24: Error: Type variables can't be used as constants.
+// const local7 = <T, T>{};
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:41:25: Error: Type variables can't be used as constants.
+// const local8 = o is T;
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:42:31: Error: Type variables can't be used as constants.
+// const local9 = o is Class<T>;
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:43:26: Error: Type variables can't be used as constants.
+// const local10 = o as T;
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:44:32: Error: Type variables can't be used as constants.
+// const local11 = o as Class<T>;
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:45:28: Error: Type variables can't be used as constants.
+// const local15 = <Class<T>>[];
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:60:18: Error: Type variables can't be used as constants.
+// print(const [T]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:61:19: Error: Type variables can't be used as constants.
+// print(const [<T>[]]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:62:19: Error: Type variables can't be used as constants.
+// print(const [<T>{}]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:63:19: Error: Type variables can't be used as constants.
+// print(const [<T, T>{}]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:63:22: Error: Type variables can't be used as constants.
+// print(const [<T, T>{}]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:64:23: Error: Type variables can't be used as constants.
+// print(const [o is T]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:65:29: Error: Type variables can't be used as constants.
+// print(const [o is Class<T>]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:66:23: Error: Type variables can't be used as constants.
+// print(const [o as T]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:67:29: Error: Type variables can't be used as constants.
+// print(const [o as Class<T>]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:68:25: Error: Type variables can't be used as constants.
+// print(const [<Class<T>>[]]);
+// ^
+//
+import self as self2;
+import "dart:core" as core;
+
+class Class<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/ {
+ final field dynamic field1;
+ final field dynamic field5;
+ final field dynamic field6;
+ final field dynamic field7;
+ final field dynamic field8;
+ final field dynamic field9;
+ final field dynamic field10;
+ final field dynamic field11;
+ final field dynamic field15;
+ const constructor •(dynamic o) → self2::Class<self2::Class::T%>
+ : self2::Class::field1 = #C1, self2::Class::field5 = #C2, self2::Class::field6 = #C3, self2::Class::field7 = #C4, self2::Class::field8 = o is{ForNonNullableByDefault} self2::Class::T%, self2::Class::field9 = o is{ForNonNullableByDefault} self2::Class<self2::Class::T%>, self2::Class::field10 = o as{ForNonNullableByDefault} self2::Class::T%, self2::Class::field11 = o{self2::Class::T%} as{ForNonNullableByDefault} self2::Class<self2::Class::T%>, self2::Class::field15 = #C19, super core::Object::•()
+ ;
+ method method() → void {
+ core::print(#C1);
+ core::print(#C2);
+ core::print(#C3);
+ core::print(#C4);
+ core::print(#C6);
+ core::print(#C7);
+ core::print(#C8);
+ core::print(#C8);
+ core::print(#C19);
+ core::print(#C20);
+ core::print(#C10);
+ core::print(#C11);
+ core::print(#C12);
+ core::print(#C13);
+ core::print(#C14);
+ core::print(#C15);
+ core::print(#C21);
+ core::print(#C22);
+ core::print(#C23);
+ }
+}
+static method id<T extends core::Object? = dynamic>(self2::id::T% t) → self2::id::T%
+ return t;
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:34:21: Error: Constant expression expected.
+// Try inserting 'const'.
+// field5 = <T>[],
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:34:19: Error: Type variables can't be used as constants.
+// field5 = <T>[],
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:35:21: Error: Constant expression expected.
+// Try inserting 'const'.
+// field6 = <T>{},
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:35:19: Error: Type variables can't be used as constants.
+// field6 = <T>{},
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:36:24: Error: Constant expression expected.
+// Try inserting 'const'.
+// field7 = <T, T>{},
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:36:19: Error: Type variables can't be used as constants.
+// field7 = <T, T>{},
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:36:22: Error: Type variables can't be used as constants.
+// field7 = <T, T>{},
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:44:29: Error: Constant expression expected.
+// Try inserting 'const'.
+// field15 = <Class<T>>[],
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:44:26: Error: Type variables can't be used as constants.
+// field15 = <Class<T>>[],
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:51:20: Error: Type variables can't be used as constants.
+// const local1 = T;
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:52:26: Error: Type variables can't be used as constants.
+// const local2 = Class<T>;
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:53:23: Error: Type variables can't be used as constants.
+// const local3 = id<T>;
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:54:25: Error: Type variables can't be used as constants.
+// const local4 = (id)<T>;
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:55:21: Error: Type variables can't be used as constants.
+// const local5 = <T>[];
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:56:21: Error: Type variables can't be used as constants.
+// const local6 = <T>{};
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:57:21: Error: Type variables can't be used as constants.
+// const local7 = <T, T>{};
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:57:24: Error: Type variables can't be used as constants.
+// const local7 = <T, T>{};
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:58:25: Error: Type variables can't be used as constants.
+// const local8 = o is T;
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:59:31: Error: Type variables can't be used as constants.
+// const local9 = o is Class<T>;
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:60:26: Error: Type variables can't be used as constants.
+// const local10 = o as T;
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:61:32: Error: Type variables can't be used as constants.
+// const local11 = o as Class<T>;
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:62:27: Error: Type variables can't be used as constants.
+// const local12 = Class<T>.new;
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:63:23: Error: Type variables can't be used as constants.
+// const local13 = F<T, T>.new;
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:63:26: Error: Type variables can't be used as constants.
+// const local13 = F<T, T>.new;
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:64:30: Error: Type variables can't be used as constants.
+// const local14 = id<Class<T>>;
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:65:28: Error: Type variables can't be used as constants.
+// const local15 = <Class<T>>[];
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:66:23: Error: Type variables can't be used as constants.
+// const local16 = G<T>.new;
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:88:18: Error: Type variables can't be used as constants.
+// print(const [T]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:89:24: Error: Type variables can't be used as constants.
+// print(const [Class<T>]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:90:21: Error: Type variables can't be used as constants.
+// print(const [id<T>]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:91:23: Error: Type variables can't be used as constants.
+// print(const [(id)<T>]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:92:19: Error: Type variables can't be used as constants.
+// print(const [<T>[]]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:93:19: Error: Type variables can't be used as constants.
+// print(const [<T>{}]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:94:19: Error: Type variables can't be used as constants.
+// print(const [<T, T>{}]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:94:22: Error: Type variables can't be used as constants.
+// print(const [<T, T>{}]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:95:23: Error: Type variables can't be used as constants.
+// print(const [o is T]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:96:29: Error: Type variables can't be used as constants.
+// print(const [o is Class<T>]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:97:23: Error: Type variables can't be used as constants.
+// print(const [o as T]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:98:29: Error: Type variables can't be used as constants.
+// print(const [o as Class<T>]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:99:24: Error: Type variables can't be used as constants.
+// print(const [Class<T>.new]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:100:20: Error: Type variables can't be used as constants.
+// print(const [F<T, T>.new]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:100:23: Error: Type variables can't be used as constants.
+// print(const [F<T, T>.new]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:101:27: Error: Type variables can't be used as constants.
+// print(const [id<Class<T>>]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:102:25: Error: Type variables can't be used as constants.
+// print(const [<Class<T>>[]]);
+// ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:103:20: Error: Type variables can't be used as constants.
+// print(const [G<T>.new]);
+// ^
+//
+import self as self3;
+import "dart:core" as core;
+
+typedef F<X extends core::Object? = dynamic, unrelated Y extends core::Object? = dynamic> = self3::Class<X%>;
+typedef G<unrelated X extends core::Object? = dynamic> = self3::Class<core::int>;
+class Class<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/ {
+ final field dynamic field1;
+ final field dynamic field2;
+ final field dynamic field3;
+ final field dynamic field4;
+ final field dynamic field5;
+ final field dynamic field6;
+ final field dynamic field7;
+ final field dynamic field8;
+ final field dynamic field9;
+ final field dynamic field10;
+ final field dynamic field11;
+ final field dynamic field12;
+ final field dynamic field13;
+ final field dynamic field14;
+ final field dynamic field15;
+ final field dynamic field16;
+ const constructor •(dynamic o) → self3::Class<self3::Class::T%>
+ : self3::Class::field1 = self3::Class::T%, self3::Class::field2 = self3::Class<self3::Class::T%>, self3::Class::field3 = #C24<self3::Class::T%>, self3::Class::field4 = #C24<self3::Class::T%>, self3::Class::field5 = #C2, self3::Class::field6 = #C3, self3::Class::field7 = #C4, self3::Class::field8 = o is{ForNonNullableByDefault} self3::Class::T%, self3::Class::field9 = o is{ForNonNullableByDefault} self3::Class<self3::Class::T%>, self3::Class::field10 = o as{ForNonNullableByDefault} self3::Class::T%, self3::Class::field11 = o{self3::Class::T%} as{ForNonNullableByDefault} self3::Class<self3::Class::T%>, self3::Class::field12 = #C25<self3::Class::T%>, self3::Class::field13 = #C25<self3::Class::T%>, self3::Class::field14 = #C24<self3::Class<self3::Class::T%>>, self3::Class::field15 = #C26, self3::Class::field16 = #C27, super core::Object::•()
+ ;
+ method method() → void {
+ core::print(#C1);
+ core::print(#C28);
+ core::print(#C29);
+ core::print(#C29);
+ core::print(#C2);
+ core::print(#C3);
+ core::print(#C4);
+ core::print(#C6);
+ core::print(#C7);
+ core::print(#C8);
+ core::print(#C8);
+ core::print(#C30);
+ core::print(#C30);
+ core::print(#C31);
+ core::print(#C26);
+ core::print(#C27);
+ core::print(#C20);
+ core::print(#C10);
+ core::print(#C32);
+ core::print(#C33);
+ core::print(#C33);
+ core::print(#C11);
+ core::print(#C12);
+ core::print(#C13);
+ core::print(#C14);
+ core::print(#C15);
+ core::print(#C21);
+ core::print(#C34);
+ core::print(#C35);
+ core::print(#C35);
+ core::print(#C36);
+ core::print(#C37);
+ core::print(#C38);
+ }
+}
+static method id<T extends core::Object? = dynamic>(self3::id::T% t) → self3::id::T%
+ return t;
+static method main() → dynamic {}
+static method _#F#new#tearOff<X extends core::Object? = dynamic, unrelated Y extends core::Object? = dynamic>(dynamic o) → self3::Class<self3::_#F#new#tearOff::X%>
+ return new self3::Class::•<self3::_#F#new#tearOff::X%>(o);
+static method _#G#new#tearOff<unrelated X extends core::Object? = dynamic>(dynamic o) → self3::Class<core::int>
+ return new self3::Class::•<core::int>(o);
+
+constants {
+ #C1 = TypeLiteralConstant(invalid-type)
+ #C2 = <invalid-type>[]
+ #C3 = <invalid-type>{}
+ #C4 = <invalid-type, invalid-type>{)
+ #C5 = <self::Class<invalid-type>*>[]
+ #C6 = true
+ #C7 = false
+ #C8 = null
+ #C9 = <Null>[]
+ #C10 = <core::Type*>[#C1]
+ #C11 = <core::List<invalid-type>*>[#C2]
+ #C12 = <core::Set<invalid-type>*>[#C3]
+ #C13 = <core::Map<invalid-type, invalid-type>*>[#C4]
+ #C14 = <core::bool*>[#C6]
+ #C15 = <core::bool*>[#C7]
+ #C16 = <invalid-type>[#C8]
+ #C17 = <self::Class<invalid-type>*>[#C8]
+ #C18 = <core::List<self::Class<invalid-type>*>*>[#C5]
+ #C19 = <self2::Class<invalid-type>*>[]
+ #C20 = <Never*>[]
+ #C21 = <dynamic>[#C8]
+ #C22 = <self2::Class<invalid-type>*>[#C8]
+ #C23 = <core::List<self2::Class<invalid-type>*>*>[#C19]
+ #C24 = static-tearoff self3::id
+ #C25 = constructor-tearoff self3::Class::•
+ #C26 = <self3::Class<invalid-type>*>[]
+ #C27 = instantiation self3::Class::• <core::int*>
+ #C28 = TypeLiteralConstant(self3::Class<invalid-type>*)
+ #C29 = instantiation self3::id <invalid-type>
+ #C30 = instantiation self3::Class::• <invalid-type>
+ #C31 = instantiation self3::id <self3::Class<invalid-type>*>
+ #C32 = <core::Type*>[#C28]
+ #C33 = <(invalid-type) →* invalid-type>[#C29]
+ #C34 = <self3::Class<invalid-type>*>[#C8]
+ #C35 = <(dynamic) →* self3::Class<invalid-type>*>[#C30]
+ #C36 = <(self3::Class<invalid-type>*) →* self3::Class<invalid-type>*>[#C31]
+ #C37 = <core::List<self3::Class<invalid-type>*>*>[#C26]
+ #C38 = <(dynamic) →* self3::Class<core::int*>*>[#C27]
+}
diff --git a/pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart b/pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart
new file mode 100644
index 0000000..f85279e
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart
@@ -0,0 +1,72 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Pre nonfunction-type-alias language version:
+// @dart=2.12
+
+T id<T>(T t) => t;
+
+class Class<T> {
+ final field1;
+ final field5;
+ final field6;
+ final field7;
+ final field8;
+ final field9;
+ final field10;
+ final field11;
+ final field15;
+
+ const Class(o)
+ // Potentially constant context:
+ : field1 = T,
+ field5 = <T>[],
+ field6 = <T>{},
+ field7 = <T, T>{},
+ field8 = o is T,
+ field9 = o is Class<T>,
+ field10 = o as T,
+ field11 = o as Class<T>,
+ field15 = <Class<T>>[];
+
+ void method() {
+ const o = null;
+
+ // Required constant context:
+ const local1 = T;
+ const local5 = <T>[];
+ const local6 = <T>{};
+ const local7 = <T, T>{};
+ const local8 = o is T;
+ const local9 = o is Class<T>;
+ const local10 = o as T;
+ const local11 = o as Class<T>;
+ const local15 = <Class<T>>[];
+ const List<T> listOfNever = []; // ok
+
+ print(local1);
+ print(local5);
+ print(local6);
+ print(local7);
+ print(local8);
+ print(local9);
+ print(local10);
+ print(local11);
+ print(local15);
+ print(listOfNever);
+
+ // Inferred constant context:
+ print(const [T]);
+ print(const [<T>[]]);
+ print(const [<T>{}]);
+ print(const [<T, T>{}]);
+ print(const [o is T]);
+ print(const [o is Class<T>]);
+ print(const [o as T]);
+ print(const [o as Class<T>]);
+ print(const [<Class<T>>[]]);
+ }
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart b/pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart
new file mode 100644
index 0000000..4b31d55
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart
@@ -0,0 +1,107 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+T id<T>(T t) => t;
+
+typedef F<X, Y> = Class<X>;
+typedef G<X> = Class<int>;
+
+class Class<T> {
+ final field1;
+ final field2;
+ final field3;
+ final field4;
+ final field5;
+ final field6;
+ final field7;
+ final field8;
+ final field9;
+ final field10;
+ final field11;
+ final field12;
+ final field13;
+ final field14;
+ final field15;
+ final field16;
+
+ const Class(o)
+ // Potentially constant context:
+ : field1 = T,
+ field2 = Class<T>,
+ field3 = id<T>,
+ field4 = (id)<T>,
+ field5 = <T>[],
+ field6 = <T>{},
+ field7 = <T, T>{},
+ field8 = o is T,
+ field9 = o is Class<T>,
+ field10 = o as T,
+ field11 = o as Class<T>,
+ field12 = Class<T>.new,
+ field13 = F<T, T>.new,
+ field14 = id<Class<T>>,
+ field15 = <Class<T>>[],
+ field16 = G<T>.new;
+
+ void method() {
+ const o = null;
+
+ // Required constant context:
+ const local1 = T;
+ const local2 = Class<T>;
+ const local3 = id<T>;
+ const local4 = (id)<T>;
+ const local5 = <T>[];
+ const local6 = <T>{};
+ const local7 = <T, T>{};
+ const local8 = o is T;
+ const local9 = o is Class<T>;
+ const local10 = o as T;
+ const local11 = o as Class<T>;
+ const local12 = Class<T>.new;
+ const local13 = F<T, T>.new;
+ const local14 = id<Class<T>>;
+ const local15 = <Class<T>>[];
+ const local16 = G<T>.new;
+ const List<T> listOfNever = []; // ok
+
+ print(local1);
+ print(local2);
+ print(local3);
+ print(local4);
+ print(local5);
+ print(local6);
+ print(local7);
+ print(local8);
+ print(local9);
+ print(local10);
+ print(local11);
+ print(local12);
+ print(local13);
+ print(local14);
+ print(local15);
+ print(local16);
+ print(listOfNever);
+
+ // Inferred constant context:
+ print(const [T]);
+ print(const [Class<T>]);
+ print(const [id<T>]);
+ print(const [(id)<T>]);
+ print(const [<T>[]]);
+ print(const [<T>{}]);
+ print(const [<T, T>{}]);
+ print(const [o is T]);
+ print(const [o is Class<T>]);
+ print(const [o as T]);
+ print(const [o as Class<T>]);
+ print(const [Class<T>.new]);
+ print(const [F<T, T>.new]);
+ print(const [id<Class<T>>]);
+ print(const [<Class<T>>[]]);
+ print(const [G<T>.new]);
+ }
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_class.dart.weak.expect b/pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_class.dart.weak.expect
index 6b52872..cb0d959 100644
--- a/pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_class.dart.weak.expect
+++ b/pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_class.dart.weak.expect
@@ -156,7 +156,7 @@
return null;
function foo6Prime() → core::List<invalid-type>*
return null;
- invalid-type foo7 = (invalid-type y) → invalid-type => y;
+ (invalid-type) →* void foo7 = (invalid-type y) → invalid-type => y;
(core::List<invalid-type>*) →* void foo7Prime = (core::List<invalid-type>* y) → core::List<invalid-type>* => y;
}
static method foo8() → () →* invalid-type {
diff --git a/pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_class.dart.weak.transformed.expect b/pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_class.dart.weak.transformed.expect
index 6b52872..cb0d959 100644
--- a/pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_class.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_class.dart.weak.transformed.expect
@@ -156,7 +156,7 @@
return null;
function foo6Prime() → core::List<invalid-type>*
return null;
- invalid-type foo7 = (invalid-type y) → invalid-type => y;
+ (invalid-type) →* void foo7 = (invalid-type y) → invalid-type => y;
(core::List<invalid-type>*) →* void foo7Prime = (core::List<invalid-type>* y) → core::List<invalid-type>* => y;
}
static method foo8() → () →* invalid-type {
diff --git a/pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_extension.dart.weak.expect b/pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_extension.dart.weak.expect
index e6c02fb..d4e95b2 100644
--- a/pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_extension.dart.weak.expect
+++ b/pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_extension.dart.weak.expect
@@ -174,7 +174,7 @@
return null;
function foo6Prime() → core::List<invalid-type>*
return null;
- invalid-type foo7 = (invalid-type y) → invalid-type => y;
+ (invalid-type) →* void foo7 = (invalid-type y) → invalid-type => y;
(core::List<invalid-type>*) →* void foo7Prime = (core::List<invalid-type>* y) → core::List<invalid-type>* => y;
}
static method Foo|foo8() → () →* invalid-type {
diff --git a/pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_extension.dart.weak.transformed.expect b/pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_extension.dart.weak.transformed.expect
index e6c02fb..d4e95b2 100644
--- a/pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_extension.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_extension.dart.weak.transformed.expect
@@ -174,7 +174,7 @@
return null;
function foo6Prime() → core::List<invalid-type>*
return null;
- invalid-type foo7 = (invalid-type y) → invalid-type => y;
+ (invalid-type) →* void foo7 = (invalid-type y) → invalid-type => y;
(core::List<invalid-type>*) →* void foo7Prime = (core::List<invalid-type>* y) → core::List<invalid-type>* => y;
}
static method Foo|foo8() → () →* invalid-type {