提交 eb1b55f1 编写于 作者: C Charles Stoner

Merge pull request #5081 from cston/529225

Report CS0513 for abstract declaration
......@@ -472,7 +472,7 @@ protected void CheckModifiersAndType(DiagnosticBag diagnostics)
// Suppressed for error types.
diagnostics.Add(ErrorCode.ERR_EventNotDelegate, location, this);
}
else if (IsAbstract && !ContainingType.IsAbstract && ContainingType.TypeKind == TypeKind.Class)
else if (IsAbstract && !ContainingType.IsAbstract && (ContainingType.TypeKind == TypeKind.Class || ContainingType.TypeKind == TypeKind.Submission))
{
// '{0}' is abstract but it is contained in non-abstract class '{1}'
diagnostics.Add(ErrorCode.ERR_AbstractInConcreteClass, location, this, ContainingType);
......
......@@ -917,7 +917,7 @@ private void CheckModifiers(Location location, DiagnosticBag diagnostics)
{
diagnostics.Add(ErrorCode.ERR_AbstractNotVirtual, location, this);
}
else if (IsAbstract && !ContainingType.IsAbstract && ContainingType.TypeKind == TypeKind.Class)
else if (IsAbstract && !ContainingType.IsAbstract && (ContainingType.TypeKind == TypeKind.Class || ContainingType.TypeKind == TypeKind.Submission))
{
// '{0}' is abstract but it is contained in non-abstract class '{1}'
diagnostics.Add(ErrorCode.ERR_AbstractInConcreteClass, location, this, ContainingType);
......
......@@ -407,7 +407,7 @@ private void CheckModifiers(Location location, bool isAutoPropertyOrExpressionBo
// Check accessibility against the accessibility declared on the accessor not the property.
var localAccessibility = this.LocalAccessibility;
if (IsAbstract && !ContainingType.IsAbstract && ContainingType.TypeKind == TypeKind.Class)
if (IsAbstract && !ContainingType.IsAbstract && (ContainingType.TypeKind == TypeKind.Class || ContainingType.TypeKind == TypeKind.Submission))
{
// '{0}' is abstract but it is contained in non-abstract class '{1}'
diagnostics.Add(ErrorCode.ERR_AbstractInConcreteClass, location, this, ContainingType);
......
......@@ -19138,6 +19138,48 @@ static void M()
}";
CreateCompilationWithMscorlib(source).VerifyDiagnostics();
}
[Fact]
public void AbstractInScript()
{
var source =
@"internal abstract void M();
internal abstract object P { get; }
internal abstract event System.EventHandler E;";
var compilation = CreateCompilationWithMscorlib45(source, parseOptions: TestOptions.Script, options: TestOptions.DebugExe);
compilation.VerifyDiagnostics(
// (1,24): error CS0513: 'M()' is abstract but it is contained in non-abstract class 'Script'
// internal abstract void M();
Diagnostic(ErrorCode.ERR_AbstractInConcreteClass, "M").WithArguments("M()", "Script").WithLocation(1, 24),
// (2,30): error CS0513: 'P.get' is abstract but it is contained in non-abstract class 'Script'
// internal abstract object P { get; }
Diagnostic(ErrorCode.ERR_AbstractInConcreteClass, "get").WithArguments("P.get", "Script").WithLocation(2, 30),
// (3,45): error CS0513: 'E' is abstract but it is contained in non-abstract class 'Script'
// internal abstract event System.EventHandler E;
Diagnostic(ErrorCode.ERR_AbstractInConcreteClass, "E").WithArguments("E", "Script").WithLocation(3, 45));
}
[WorkItem(529225)]
[Fact]
public void AbstractInSubmission()
{
var references = new[] { MscorlibRef_v4_0_30316_17626, SystemCoreRef };
var source =
@"internal abstract void M();
internal abstract object P { get; }
internal abstract event System.EventHandler E;";
var submission = CSharpCompilation.CreateSubmission("s0.dll", SyntaxFactory.ParseSyntaxTree(source, options: TestOptions.Interactive), new[] { MscorlibRef_v4_0_30316_17626, SystemCoreRef });
submission.VerifyDiagnostics(
// (1,24): error CS0513: 'M()' is abstract but it is contained in non-abstract class 'Script'
// internal abstract void M();
Diagnostic(ErrorCode.ERR_AbstractInConcreteClass, "M").WithArguments("M()", "Script").WithLocation(1, 24),
// (2,30): error CS0513: 'P.get' is abstract but it is contained in non-abstract class 'Script'
// internal abstract object P { get; }
Diagnostic(ErrorCode.ERR_AbstractInConcreteClass, "get").WithArguments("P.get", "Script").WithLocation(2, 30),
// (3,45): error CS0513: 'E' is abstract but it is contained in non-abstract class 'Script'
// internal abstract event System.EventHandler E;
Diagnostic(ErrorCode.ERR_AbstractInConcreteClass, "E").WithArguments("E", "Script").WithLocation(3, 45));
}
}
}
......@@ -23673,5 +23673,46 @@ Imports GlobEnumsClass
</expected>)
End Sub
<Fact>
Public Sub MustOverrideInScript()
Dim comp = CreateCompilationWithMscorlib(
<compilation>
<file name="a.vbx"><![CDATA[
Friend MustOverride Function F() As Object
Friend MustOverride ReadOnly Property P
]]></file>
</compilation>,
parseOptions:=TestOptions.Script,
references:={MscorlibRef, SystemCoreRef})
comp.AssertTheseDiagnostics(<expected>
BC30607: 'NotInheritable' classes cannot have members declared 'MustOverride'.
Friend MustOverride Function F() As Object
~~~~~~~~~~~~
BC30607: 'NotInheritable' classes cannot have members declared 'MustOverride'.
Friend MustOverride ReadOnly Property P
~~~~~~~~~~~~
</expected>)
End Sub
<Fact>
Public Sub MustOverrideInInteractive()
Dim source = <![CDATA[
Friend MustOverride Function F() As Object
Friend MustOverride ReadOnly Property P
]]>
Dim submission = VisualBasicCompilation.CreateSubmission(
"s0.dll",
syntaxTree:=Parse(source.Value, TestOptions.Interactive),
references:={MscorlibRef, SystemCoreRef})
submission.AssertTheseDiagnostics(<expected>
BC30607: 'NotInheritable' classes cannot have members declared 'MustOverride'.
Friend MustOverride Function F() As Object
~~~~~~~~~~~~
BC30607: 'NotInheritable' classes cannot have members declared 'MustOverride'.
Friend MustOverride ReadOnly Property P
~~~~~~~~~~~~
</expected>)
End Sub
End Class
End Namespace
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册