Operating systems are written in C. Well, long ago, they were written in assembler. But after that, C.
Many people think that's stupid, because, obviously C++ is a better choice. It's newer. It's designed to be a better C. So, it would be better to use that. Right?
Eh, no. C++ requires things like a memory manager and scheduler to be able to function. Or, in other words: an OS. And C++ is very broken.
There are very many courses, seminars and trainings that help you navigate the vast amount of programming pitfalls the average programmer encounters daily. And they are all about C++. Because other programming languages rarely suffer from those problems.
There are many problems with C++. But the main ones are: speed over all, templates, void pointers, no finalizers, no modules and strings.
Speed: If anything that would make programming better and safer takes longer to execute, it is automatically disregarded. Programmers are expected to know in detail how everything works. The compiler isn't going to help you.
Templates: They can redefine everything. So, some random line of code, somewhere in the project, can change what any keyword or variable does. So, you have no idea what your code is going to do in a large project. And this is regarded one of the best features of C++!
Void pointers: There are very many ways in C++ to address things. Like, if you want to change the value of a variable, you can use the variable name and have it dereferenced automatically, you can use an explicit reference, or simply put an asterix in front. There are more, like arrays. And while they all seem to do the same thing, they don't. You have to use the same pattern that was used to declare the variable. Often, the only way to do that is to cast it to a generic ("void") pointer. And that throws away all the type information. The compiler cannot check the correctness.
Finalizers: In Free Pascal, you have try..finally. Which will execute the code after "finally" no matter what (well, unless your app is already killed by the OS). And that's why destructors work. You are assured that they will run. Not so in C++. It's a minefield. Stuff might get freed, depending. Lots of papers have been written about this.
Modules: In C++, all your code is build as a single unit. You can compile parts, if you supply the object file and a header file. And the right versions of all the parts. That's why it is very hard to use any downloaded code. It probably won't work, because there's a discrepancy in one of the hundreds of header files used. Which you cannot fix, because your version is slightly different. And because it evolved from a C pre-processor, all the names are mangled. That's why we have namespaces, instead of modules. And namespaces can be distributed throughout the source code. If there are a hundred people working on a project, they can all be maintaining part of all of those namespaces...
Strings: Or, dynamic arrays in general. This should be the big showstopper. In C and C++, most arrays are unlimited in size, and end when an item has value 0. So, they never know how long an array is. To find out, you have to read all the items until you encounter one that is 0. This is what most malware uses to penetrate, and why C and C++ software is so very buggy.
So, why is C++ used so much, if it is so bad? Well, it was seen as an upgrade to C, the programming language most programmers used at that time, and so it is what most senior programmers have used most of their life. It's what they're familiar with. To them, it is how it should be.
So, why is it that most programming languages use the C syntax, instead of something verbose, like Pascal or Fortran? Two reasons. First, it seems that there are less characters to type in C: "{" instead of "begin", for example. That isn't really true, because you have to specify more meta-data. And you have to provide much more comments, because C and C++ are hard to read and understand.
But, the cryptic nature is seen as a good thing. It makes your job sound much better, if it looks like incomprehensible mumbo-jumbo. Also, getting a job is easy, but to keep it you have to make yourself indispensable. Or, at least, that's a common rhetoric. And the best way to do that, is to make sure nobody understands your code.
This is also reinforced by the need for speed. No matter that the speed of 99% of your code is irrelevant and barely measurable, many (C and C++) programmers feel the need to make sure that every bit of their code is smoking. They don't trust the compiler to get it right, which is probably a good thing because even compilers find C++ really hard to comprehend. Writing your code in a totally incomprehensible way, but which might be a bit faster is seen as mastering your profession.
So, what does this have to do with Free Pascal? Simple. It doesn't have those problems. If you rewrote Linux in it, it would be nearly bullet-proof. But them again, no OSes are written in it, and you don't need to create a free pascal compiler to roll out your tool chain. Because that is written in C and C++.