More windows breakage

Sorry - I'm in the middle of subscribing to the cfe-commits list so can't reply directly to the actual commit:

Commit r74539 by Edwin Torok breaks at link time with MSVC.

The cause is the following:

+template<typename TargetInfo>
+class OSTargetInfo : public TargetInfo {
+protected:
+ virtual void getOSDefines(const LangOptions &Opts, const char *Triple,
+ std::vector<char> &Defines) const=0;
+public:
+ OSTargetInfo(const std::string& triple) : TargetInfo(triple) {}
+ virtual void getTargetDefines(const LangOptions &Opts,
+ std::vector<char> &Defines) const {
+ TargetInfo::getTargetDefines(Opts, Defines);
+ getOSDefines(Opts, TargetInfo::getTargetTriple(), Defines);
   }
-}

Here, TargetInfo is used as a template parameter name, but it is also the name of the fundamental base class of types that will be used to instantiate the template. Therefore, the line

    TargetInfo::getTargetDefines(Opts, Defines);

is being dispatched to the base class called TargetInfo, rather than the type referred to by the template parameter name TargetInfo. As this is a pure abstract method, I presumed static dispatch should have been a compile-time rather than link-time error, but apparently not with MSVC.

Patch attached.

AlisdairM

TargetInfo.patch (1.14 KB)

Sorry - I'm in the middle of subscribing to the cfe-commits list so can't reply directly to the actual commit:

Commit r74539 by Edwin Torok breaks at link time with MSVC.

The cause is the following:

+template<typename TargetInfo>
+class OSTargetInfo : public TargetInfo {
+protected:
+ virtual void getOSDefines(const LangOptions &Opts, const char *Triple,
+ std::vector<char> &Defines) const=0;
+public:
+ OSTargetInfo(const std::string& triple) : TargetInfo(triple) {}
+ virtual void getTargetDefines(const LangOptions &Opts,
+ std::vector<char> &Defines) const {
+ TargetInfo::getTargetDefines(Opts, Defines);
+ getOSDefines(Opts, TargetInfo::getTargetTriple(), Defines);
  }
-}

Here, TargetInfo is used as a template parameter name, but it is also the name of the fundamental base class of types that will be used to instantiate the template. Therefore, the line

   TargetInfo::getTargetDefines(Opts, Defines);

is being dispatched to the base class called TargetInfo, rather than the type referred to by the template parameter name TargetInfo. As this is a pure abstract method, I presumed static dispatch should have been a compile-time rather than link-time error, but apparently not with MSVC.

Weird.

Patch attached.

... and committed. Thanks again!

  - Doug