Question about functions not getting declared

Hello, I’m having a confusing time with functions. I have 2 functions that are declared after the void loop, but one of them doesn’t get declared in the void loop function for some reason. Here is the code:

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define triggerPin 10
#define echoPin 11
#define buttonPin 2

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT);

//---------------------------------------------------------------------------------

//variables
bool buttonState = HIGH;
bool ledState = LOW;

void setup() {
  Serial.begin(9600);

  pinMode (triggerPin, OUTPUT);
  pinMode (echoPin, INPUT);
  pinMode (buttonPin, INPUT);
  digitalWrite(buttonPin, HIGH);

  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
    Serial.println(F("SSD1306 allocation failed"));
    for (;;); // Don't proceed, loop forever
  }

  display.setTextColor(WHITE);
}

//---------------------------------------------------------------------------------

void loop() {
  printMsg("Press Button to Measure", 1);
  while (buttonState == HIGH) {
    buttonState = digitalRead(buttonPin);
  }
  buttonState = HIGH;

  Serial.println(buttonState);
  display.setCursor(0, 0);
  display.println(calcDist());
  display.display();
}

//-----------------------------------------------------------------------------------

void printMsg(String text, int fontSize = 7) {
  display.setTextSize(fontSize);
  display.setCursor(0, 0);
  display.println(text);
  display.display();
}

float calcDist() {
  float bucket = 0, avg = 0, time, distance;
  for (int j = 1; j <= 50; j++) {
    digitalWrite (triggerPin, HIGH);
    delayMicroseconds (10);
    digitalWrite (triggerPin, LOW);
    time = pulseIn (echoPin, HIGH);
    bucket += (time * 0.034) / 2;
  }
  avg = bucket / 50;
  return avg;
}

The function I’m talking about is void printMsg(). calcDist() works fine, but for some reason, printMsg doesnt get declared and I get an error. It’s probably something obvious and I’m being dumb, so feel free to explain this to me and/or refer me to some sources about this.

Thanks.

EDIT: Got it fixed by declaring a prototype, but I’m still wondering why didn’t Arduino do it for me by itself. Any ideas?

It does a pretty good job of creating prototypes, except when you’ve got defaults.

TheMemberFormerlyKnownAsAWOL:
It does a pretty good job,except when you've got defaults.

Oh, I see. That's kinda weird, haha.