mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-05 22:02:55 +01:00
Compute specific constant values. (#4128)
When forming a specific (previously called a generic instance), evaluate the eval block of the generic to determine the values of any constants used in that specific. The majority of the work here is updating eval.cpp so that it can use the results of prior evaluations in the same block when computing later values. Include the computed results in the formatted SemIR output. --------- Co-authored-by: Jon Ross-Perkins <jperkins@google.com>
This commit is contained in:
co-authored by
Jon Ross-Perkins
parent
be94782eda
commit
efea072be3
@@ -58,3 +58,8 @@ fn F(N:! i32, a: [i32; N]*);
|
||||
// CHECK:STDOUT: fn @F(%N: i32, %a: <error>)
|
||||
// CHECK:STDOUT: generic [%N: i32];
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: specific file.%F.decl(constants.%N) {
|
||||
// CHECK:STDOUT: declaration:
|
||||
// CHECK:STDOUT: @F.%N => constants.%N
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
|
||||
+6
@@ -54,3 +54,9 @@ fn F(T:! type, U:! type) {
|
||||
// CHECK:STDOUT: return
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: specific file.%F.decl(constants.%T, constants.%U) {
|
||||
// CHECK:STDOUT: declaration:
|
||||
// CHECK:STDOUT: @F.%T => constants.%T
|
||||
// CHECK:STDOUT: @F.%U => constants.%U
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
|
||||
+7
@@ -50,3 +50,10 @@ fn F(T:! type, p: T**) -> T* {
|
||||
// CHECK:STDOUT: return %.loc12_10.2
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: specific file.%F.decl(constants.%T) {
|
||||
// CHECK:STDOUT: declaration:
|
||||
// CHECK:STDOUT: @F.%T => constants.%T
|
||||
// CHECK:STDOUT: file.%.loc11_20 => constants.%.1
|
||||
// CHECK:STDOUT: file.%.loc11_21 => constants.%.2
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
|
||||
@@ -49,3 +49,8 @@ fn F(T:! type) {
|
||||
// CHECK:STDOUT: return
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: specific file.%F.decl(constants.%T) {
|
||||
// CHECK:STDOUT: declaration:
|
||||
// CHECK:STDOUT: @F.%T => constants.%T
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
|
||||
@@ -47,3 +47,8 @@ fn F(T:! type, n: T) -> T {
|
||||
// CHECK:STDOUT: return %m.ref
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: specific file.%F.decl(constants.%T) {
|
||||
// CHECK:STDOUT: declaration:
|
||||
// CHECK:STDOUT: @F.%T => constants.%T
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
|
||||
@@ -145,6 +145,12 @@ fn F(U:! type, T:! type) -> U* {
|
||||
// CHECK:STDOUT: return %.loc7_14.2
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: specific file.%F.decl.loc4(constants.%T) {
|
||||
// CHECK:STDOUT: declaration:
|
||||
// CHECK:STDOUT: file.%T.loc4_6.2 => constants.%T
|
||||
// CHECK:STDOUT: file.%.loc4 => constants.%.1
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: --- fail_different_return_type.carbon
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: constants {
|
||||
@@ -198,6 +204,20 @@ fn F(U:! type, T:! type) -> U* {
|
||||
// CHECK:STDOUT: return <error>
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: specific file.%F.decl(constants.%T, constants.%U) {
|
||||
// CHECK:STDOUT: declaration:
|
||||
// CHECK:STDOUT: @F.%T => constants.%T
|
||||
// CHECK:STDOUT: @F.%U => constants.%U
|
||||
// CHECK:STDOUT: file.%.loc4 => constants.%.1
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: specific file.%.decl(constants.%T, constants.%U) {
|
||||
// CHECK:STDOUT: declaration:
|
||||
// CHECK:STDOUT: @.1.%T => constants.%T
|
||||
// CHECK:STDOUT: @.1.%U => constants.%U
|
||||
// CHECK:STDOUT: file.%.loc13 => constants.%.3
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: --- fail_reorder.carbon
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: constants {
|
||||
@@ -253,6 +273,20 @@ fn F(U:! type, T:! type) -> U* {
|
||||
// CHECK:STDOUT: return <error>
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: specific file.%F.decl(constants.%T.1, constants.%U.1) {
|
||||
// CHECK:STDOUT: declaration:
|
||||
// CHECK:STDOUT: @F.%T => constants.%T.1
|
||||
// CHECK:STDOUT: @F.%U => constants.%U.1
|
||||
// CHECK:STDOUT: file.%.loc4 => constants.%.1
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: specific file.%.decl(constants.%U.2, constants.%T.2) {
|
||||
// CHECK:STDOUT: declaration:
|
||||
// CHECK:STDOUT: @.1.%U => constants.%U.2
|
||||
// CHECK:STDOUT: @.1.%T => constants.%T.2
|
||||
// CHECK:STDOUT: file.%.loc13 => constants.%.3
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: --- fail_rename.carbon
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: constants {
|
||||
@@ -308,3 +342,17 @@ fn F(U:! type, T:! type) -> U* {
|
||||
// CHECK:STDOUT: return <error>
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: specific file.%F.decl(constants.%T.1, constants.%U.1) {
|
||||
// CHECK:STDOUT: declaration:
|
||||
// CHECK:STDOUT: @F.%T => constants.%T.1
|
||||
// CHECK:STDOUT: @F.%U => constants.%U.1
|
||||
// CHECK:STDOUT: file.%.loc4 => constants.%.1
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: specific file.%.decl(constants.%U.2, constants.%T.2) {
|
||||
// CHECK:STDOUT: declaration:
|
||||
// CHECK:STDOUT: @.1.%U => constants.%U.2
|
||||
// CHECK:STDOUT: @.1.%T => constants.%T.2
|
||||
// CHECK:STDOUT: file.%.loc13 => constants.%.3
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
|
||||
Reference in New Issue
Block a user