<div dir="ltr">Unfortunately, I don't have a Windows machine to test this, but I believe the bug is inside YAML I/O itself. If you can provide more information, I'd suggest that you file a bug with CC to Nick Kledzik <<a href="mailto:kledzik@apple.com">kledzik@apple.com</a>>. And meanwhile you can disable the test on Windows with #ifndef _WIN32.
</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, May 10, 2013 at 4:31 PM, Aaron Ballman <span dir="ltr"><<a href="mailto:aaron@aaronballman.com" target="_blank">aaron@aaronballman.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">After fetching today (I saw you did part 2), I get different failures.<br>
<br>
182>  FAIL: Clang-Unit ::<br>
Format/F:\llvm\build\tools\clang\unittests\Format\Debug/FormatTests.exe/FormatTest.ConfigurationRoundTripTest<br>
(6013 of 6255)<br>
182>  ******************** TEST 'Clang-Unit ::<br>
Format/F:\llvm\build\tools\clang\unittests\Format\Debug/FormatTests.exe/FormatTest.ConfigurationRoundTripTest'<br>
FAILED ********************<br>
182>  Note: Google Test filter = FormatTest.ConfigurationRoundTripTest<br>
182><br>
182>  [==========] Running 1 test from 1 test case.<br>
182><br>
182>  [----------] Global test environment set-up.<br>
182><br>
182>  [----------] 1 test from FormatTest<br>
182><br>
182>  [ RUN      ] FormatTest.ConfigurationRoundTripTest<br>
182><br>
182>F:\llvm\llvm\tools\clang\unittests\Format\FormatTest.cpp(4038):<br>
error : Value of: parseConfiguration(YAML, &ParsedStyle).value()<br>
182><br>
182>    Actual: 22<br>
182><br>
182>  Expected: 0<br>
182><br>
182>  [  FAILED  ] FormatTest.ConfigurationRoundTripTest (2 ms)<br>
182><br>
182>  [----------] 1 test from FormatTest (2 ms total)<br>
182><br>
182><br>
182><br>
182>  [----------] Global test environment tear-down<br>
182><br>
182>  [==========] 1 test from 1 test case ran. (2 ms total)<br>
182><br>
182>  [  PASSED  ] 0 tests.<br>
182><br>
182>  [  FAILED  ] 1 test, listed below:<br>
182><br>
182>  [  FAILED  ] FormatTest.ConfigurationRoundTripTest<br>
182><br>
182><br>
182><br>
182>   1 FAILED TEST<br>
182><br>
182>  YAML:18:8: error: unknown key 'Standar'<br>
182>  Standar<br>
182>         ^<br>
182><br>
182>  ********************<br>
182><br>
182>  Testing Time: 112.79s<br>
182>  ********************<br>
182>  Failing Tests (1):<br>
182>      Clang-Unit ::<br>
Format/F:\llvm\build\tools\clang\unittests\Format\Debug/FormatTests.exe/FormatTest.ConfigurationRoundTripTest<br>
182><br>
182>    Expected Passes    : 6148<br>
182>    Expected Failures  : 27<br>
182>    Unsupported Tests  : 79<br>
182>    Unexpected Failures: 1<br>
<br>
So the original failure seems to be gone, but a new one has popped up<br>
in its place.  This time I am testing with MSVC 11 on Windows 7 x64 as<br>
a debug build.<br>
<span class="HOEnZb"><font color="#888888"><br>
~Aaron<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
On Thu, May 9, 2013 at 9:38 PM, Alexander Kornienko <<a href="mailto:alexfh@google.com">alexfh@google.com</a>> wrote:<br>
><br>
> On Thu, May 9, 2013 at 10:24 PM, Aaron Ballman <<a href="mailto:aaron@aaronballman.com">aaron@aaronballman.com</a>><br>
> wrote:<br>
>><br>
>> On Tue, May 7, 2013 at 11:32 AM, Alexander Kornienko <<a href="mailto:alexfh@google.com">alexfh@google.com</a>><br>
>> wrote:<br>
>> > Author: alexfh<br>
>> > Date: Tue May  7 10:32:14 2013<br>
>> > New Revision: 181326<br>
>> ><br>
>> > URL: <a href="http://llvm.org/viewvc/llvm-project?rev=181326&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=181326&view=rev</a><br>
>> > Log:<br>
>> > Config file support for clang-format, part 1.<br>
>> ><br>
>> > Summary:<br>
>> > Added parseConfiguration method, which reads FormatStyle from YAML<br>
>> > string. This supports all FormatStyle fields and an additional<br>
>> > BasedOnStyle<br>
>> > field, which can be used to specify base style.<br>
>> ><br>
>> > Reviewers: djasper, klimek<br>
>> ><br>
>> > Reviewed By: djasper<br>
>> ><br>
>> > CC: cfe-commits<br>
>> ><br>
>> > Differential Revision: <a href="http://llvm-reviews.chandlerc.com/D754" target="_blank">http://llvm-reviews.chandlerc.com/D754</a><br>
>> ><br>
>> > Modified:<br>
>> >     cfe/trunk/include/clang/Format/Format.h<br>
>> >     cfe/trunk/lib/Format/Format.cpp<br>
>> >     cfe/trunk/unittests/Format/FormatTest.cpp<br>
>> ><br>
>> > Modified: cfe/trunk/include/clang/Format/Format.h<br>
>> > URL:<br>
>> > <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Format/Format.h?rev=181326&r1=181325&r2=181326&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Format/Format.h?rev=181326&r1=181325&r2=181326&view=diff</a><br>

>> ><br>
>> > ==============================================================================<br>
>> > --- cfe/trunk/include/clang/Format/Format.h (original)<br>
>> > +++ cfe/trunk/include/clang/Format/Format.h Tue May  7 10:32:14 2013<br>
>> > @@ -17,6 +17,7 @@<br>
>> ><br>
>> >  #include "clang/Frontend/FrontendAction.h"<br>
>> >  #include "clang/Tooling/Refactoring.h"<br>
>> > +#include "llvm/Support/system_error.h"<br>
>> ><br>
>> >  namespace clang {<br>
>> ><br>
>> > @@ -110,6 +111,18 @@ FormatStyle getChromiumStyle();<br>
>> >  ///<br>
>> > <a href="https://developer.mozilla.org/en-US/docs/Developer_Guide/Coding_Style" target="_blank">https://developer.mozilla.org/en-US/docs/Developer_Guide/Coding_Style</a>.<br>
>> >  FormatStyle getMozillaStyle();<br>
>> ><br>
>> > +/// \brief Returns a predefined style by name.<br>
>> > +///<br>
>> > +/// Currently supported names: LLVM, Google, Chromium, Mozilla. Names<br>
>> > are<br>
>> > +/// compared case-insensitively.<br>
>> > +FormatStyle getPredefinedStyle(StringRef Name);<br>
>> > +<br>
>> > +/// \brief Parse configuration from YAML-formatted text.<br>
>> > +llvm::error_code parseConfiguration(StringRef Text, FormatStyle<br>
>> > *Style);<br>
>> > +<br>
>> > +/// \brief Gets configuration in a YAML string.<br>
>> > +std::string configurationAsText(const FormatStyle &Style);<br>
>> > +<br>
>> >  /// \brief Reformats the given \p Ranges in the token stream coming out<br>
>> > of<br>
>> >  /// \c Lex.<br>
>> >  ///<br>
>> ><br>
>> > Modified: cfe/trunk/lib/Format/Format.cpp<br>
>> > URL:<br>
>> > <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/Format.cpp?rev=181326&r1=181325&r2=181326&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/Format.cpp?rev=181326&r1=181325&r2=181326&view=diff</a><br>

>> ><br>
>> > ==============================================================================<br>
>> > --- cfe/trunk/lib/Format/Format.cpp (original)<br>
>> > +++ cfe/trunk/lib/Format/Format.cpp Tue May  7 10:32:14 2013<br>
>> > @@ -28,9 +28,59 @@<br>
>> >  #include "llvm/ADT/STLExtras.h"<br>
>> >  #include "llvm/Support/Allocator.h"<br>
>> >  #include "llvm/Support/Debug.h"<br>
>> > +#include "llvm/Support/YAMLTraits.h"<br>
>> >  #include <queue><br>
>> >  #include <string><br>
>> ><br>
>> > +namespace llvm {<br>
>> > +namespace yaml {<br>
>> > +template <><br>
>> > +struct<br>
>> > ScalarEnumerationTraits<clang::format::FormatStyle::LanguageStandard> {<br>
>> > +  static void enumeration(IO &io,<br>
>> > +                          clang::format::FormatStyle::LanguageStandard<br>
>> > &value) {<br>
>> > +    io.enumCase(value, "C++03", clang::format::FormatStyle::LS_Cpp03);<br>
>> > +    io.enumCase(value, "C++11", clang::format::FormatStyle::LS_Cpp11);<br>
>> > +    io.enumCase(value, "Auto", clang::format::FormatStyle::LS_Auto);<br>
>> > +  }<br>
>> > +};<br>
>> > +<br>
>> > +template <> struct MappingTraits<clang::format::FormatStyle> {<br>
>> > +  static void mapping(llvm::yaml::IO &IO, clang::format::FormatStyle<br>
>> > &Style) {<br>
>> > +    if (!IO.outputting()) {<br>
>> > +      StringRef BasedOnStyle;<br>
>> > +      IO.mapOptional("BasedOnStyle", BasedOnStyle);<br>
>> > +<br>
>> > +      if (!BasedOnStyle.empty())<br>
>> > +        Style = clang::format::getPredefinedStyle(BasedOnStyle);<br>
>> > +    }<br>
>> > +<br>
>> > +    IO.mapOptional("AccessModifierOffset", Style.AccessModifierOffset);<br>
>> > +    IO.mapOptional("AlignEscapedNewlinesLeft",<br>
>> > Style.AlignEscapedNewlinesLeft);<br>
>> > +    IO.mapOptional("AllowAllParametersOfDeclarationOnNextLine",<br>
>> > +                   Style.AllowAllParametersOfDeclarationOnNextLine);<br>
>> > +    IO.mapOptional("AllowShortIfStatementsOnASingleLine",<br>
>> > +                   Style.AllowShortIfStatementsOnASingleLine);<br>
>> > +    IO.mapOptional("BinPackParameters", Style.BinPackParameters);<br>
>> > +    IO.mapOptional("ColumnLimit", Style.ColumnLimit);<br>
>> > +    IO.mapOptional("ConstructorInitializerAllOnOneLineOrOnePerLine",<br>
>> > +<br>
>> > Style.ConstructorInitializerAllOnOneLineOrOnePerLine);<br>
>> > +    IO.mapOptional("DerivePointerBinding", Style.DerivePointerBinding);<br>
>> > +    IO.mapOptional("IndentCaseLabels", Style.IndentCaseLabels);<br>
>> > +    IO.mapOptional("MaxEmptyLinesToKeep", Style.MaxEmptyLinesToKeep);<br>
>> > +    IO.mapOptional("ObjCSpaceBeforeProtocolList",<br>
>> > +                   Style.ObjCSpaceBeforeProtocolList);<br>
>> > +    IO.mapOptional("PenaltyExcessCharacter",<br>
>> > Style.PenaltyExcessCharacter);<br>
>> > +    IO.mapOptional("PenaltyReturnTypeOnItsOwnLine",<br>
>> > +                   Style.PenaltyReturnTypeOnItsOwnLine);<br>
>> > +    IO.mapOptional("PointerBindsToType", Style.PointerBindsToType);<br>
>> > +    IO.mapOptional("SpacesBeforeTrailingComments",<br>
>> > +                   Style.SpacesBeforeTrailingComments);<br>
>> > +    IO.mapOptional("Standard", Style.Standard);<br>
>> > +  }<br>
>> > +};<br>
>> > +}<br>
>> > +}<br>
>> > +<br>
>> >  namespace clang {<br>
>> >  namespace format {<br>
>> ><br>
>> > @@ -98,6 +148,37 @@ FormatStyle getMozillaStyle() {<br>
>> >    return MozillaStyle;<br>
>> >  }<br>
>> ><br>
>> > +FormatStyle getPredefinedStyle(StringRef Name) {<br>
>> > +  if (Name.equals_lower("llvm"))<br>
>> > +    return getLLVMStyle();<br>
>> > +  if (Name.equals_lower("chromium"))<br>
>> > +    return getChromiumStyle();<br>
>> > +  if (Name.equals_lower("mozilla"))<br>
>> > +    return getMozillaStyle();<br>
>> > +  if (Name.equals_lower("google"))<br>
>> > +    return getGoogleStyle();<br>
>> > +<br>
>> > +  llvm::errs() << "Unknown style " << Name << ", using Google<br>
>> > style.\n";<br>
>> > +  return getGoogleStyle();<br>
>> > +}<br>
>> > +<br>
>> > +llvm::error_code parseConfiguration(StringRef Text, FormatStyle *Style)<br>
>> > {<br>
>> > +  llvm::yaml::Input Input(Text);<br>
>> > +  Input >> *Style;<br>
>> > +  return Input.error();<br>
>> > +}<br>
>> > +<br>
>> > +std::string configurationAsText(const FormatStyle &Style) {<br>
>> > +  std::string Text;<br>
>> > +  llvm::raw_string_ostream Stream(Text);<br>
>> > +  llvm::yaml::Output Output(Stream);<br>
>> > +  // We use the same mapping method for input and output, so we need a<br>
>> > non-const<br>
>> > +  // reference here.<br>
>> > +  FormatStyle NonConstStyle = Style;<br>
>> > +  Output << NonConstStyle;<br>
>> > +  return Text;<br>
>> > +}<br>
>> > +<br>
>> >  // Returns the length of everything up to the first possible line break<br>
>> > after<br>
>> >  // the ), ], } or > matching \c Tok.<br>
>> >  static unsigned getLengthToMatchingParen(const AnnotatedToken &Tok) {<br>
>> ><br>
>> > Modified: cfe/trunk/unittests/Format/FormatTest.cpp<br>
>> > URL:<br>
>> > <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Format/FormatTest.cpp?rev=181326&r1=181325&r2=181326&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Format/FormatTest.cpp?rev=181326&r1=181325&r2=181326&view=diff</a><br>

>> ><br>
>> > ==============================================================================<br>
>> > --- cfe/trunk/unittests/Format/FormatTest.cpp (original)<br>
>> > +++ cfe/trunk/unittests/Format/FormatTest.cpp Tue May  7 10:32:14 2013<br>
>> > @@ -3909,5 +3909,113 @@ TEST_F(FormatTest, DoNotCreateUnreasonab<br>
>> >                 "}");<br>
>> >  }<br>
>> ><br>
>> > +bool operator==(const FormatStyle &L, const FormatStyle &R) {<br>
>> > +  return L.AccessModifierOffset == R.AccessModifierOffset &&<br>
>> > +         L.AlignEscapedNewlinesLeft == R.AlignEscapedNewlinesLeft &&<br>
>> > +         L.AllowAllParametersOfDeclarationOnNextLine ==<br>
>> > +             R.AllowAllParametersOfDeclarationOnNextLine &&<br>
>> > +         L.AllowShortIfStatementsOnASingleLine ==<br>
>> > +             R.AllowShortIfStatementsOnASingleLine &&<br>
>> > +         L.BinPackParameters == R.BinPackParameters &&<br>
>> > +         L.ColumnLimit == R.ColumnLimit &&<br>
>> > +         L.ConstructorInitializerAllOnOneLineOrOnePerLine ==<br>
>> > +             R.ConstructorInitializerAllOnOneLineOrOnePerLine &&<br>
>> > +         L.DerivePointerBinding == R.DerivePointerBinding &&<br>
>> > +         L.IndentCaseLabels == R.IndentCaseLabels &&<br>
>> > +         L.MaxEmptyLinesToKeep == R.MaxEmptyLinesToKeep &&<br>
>> > +         L.ObjCSpaceBeforeProtocolList == R.ObjCSpaceBeforeProtocolList<br>
>> > &&<br>
>> > +         L.PenaltyExcessCharacter == R.PenaltyExcessCharacter &&<br>
>> > +         L.PenaltyReturnTypeOnItsOwnLine ==<br>
>> > R.PenaltyReturnTypeOnItsOwnLine &&<br>
>> > +         L.PointerBindsToType == R.PointerBindsToType &&<br>
>> > +         L.SpacesBeforeTrailingComments ==<br>
>> > R.SpacesBeforeTrailingComments &&<br>
>> > +         L.Standard == R.Standard;<br>
>> > +}<br>
>> > +<br>
>> > +bool allStylesEqual(ArrayRef<FormatStyle> Styles) {<br>
>> > +  for (size_t i = 1; i < Styles.size(); ++i)<br>
>> > +    if (!(Styles[0] == Styles[i]))<br>
>> > +      return false;<br>
>> > +  return true;<br>
>> > +}<br>
>> > +<br>
>> > +TEST_F(FormatTest, GetsPredefinedStyleByName) {<br>
>> > +  FormatStyle LLVMStyles[] = { getLLVMStyle(),<br>
>> > getPredefinedStyle("LLVM"),<br>
>> > +                               getPredefinedStyle("llvm"),<br>
>> > +                               getPredefinedStyle("lLvM") };<br>
>> > +  EXPECT_TRUE(allStylesEqual(LLVMStyles));<br>
>> > +<br>
>> > +  FormatStyle GoogleStyles[] = { getGoogleStyle(),<br>
>> > getPredefinedStyle("Google"),<br>
>> > +                                 getPredefinedStyle("google"),<br>
>> > +                                 getPredefinedStyle("gOOgle") };<br>
>> > +  EXPECT_TRUE(allStylesEqual(GoogleStyles));<br>
>> > +<br>
>> > +  FormatStyle ChromiumStyles[] = { getChromiumStyle(),<br>
>> > +                                   getPredefinedStyle("Chromium"),<br>
>> > +                                   getPredefinedStyle("chromium"),<br>
>> > +                                   getPredefinedStyle("chROmiUM") };<br>
>> > +  EXPECT_TRUE(allStylesEqual(ChromiumStyles));<br>
>> > +<br>
>> > +  FormatStyle MozillaStyles[] = { getMozillaStyle(),<br>
>> > +                                  getPredefinedStyle("Mozilla"),<br>
>> > +                                  getPredefinedStyle("mozilla"),<br>
>> > +                                  getPredefinedStyle("moZilla") };<br>
>> > +  EXPECT_TRUE(allStylesEqual(MozillaStyles));<br>
>> > +}<br>
>> > +<br>
>> > +TEST_F(FormatTest, ParsesConfiguration) {<br>
>> > +  FormatStyle Style = {};<br>
>> > +#define CHECK_PARSE(TEXT, FIELD, VALUE)<br>
>> > \<br>
>> > +  EXPECT_NE(VALUE, Style.FIELD);<br>
>> > \<br>
>> > +  EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value());<br>
>> > \<br>
>> > +  EXPECT_EQ(VALUE, Style.FIELD)<br>
>> > +<br>
>> > +#define CHECK_PARSE_BOOL(FIELD)<br>
>> > \<br>
>> > +  Style.FIELD = false;<br>
>> > \<br>
>> > +  EXPECT_EQ(0, parseConfiguration(#FIELD ": true", &Style).value());<br>
>> > \<br>
>> > +  EXPECT_EQ(true, Style.FIELD);<br>
>> > \<br>
>> > +  EXPECT_EQ(0, parseConfiguration(#FIELD ": false", &Style).value());<br>
>> > \<br>
>> > +  EXPECT_EQ(false, Style.FIELD);<br>
>> > +<br>
>> > +  CHECK_PARSE_BOOL(AlignEscapedNewlinesLeft);<br>
>> > +  CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);<br>
>> > +  CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);<br>
>> > +  CHECK_PARSE_BOOL(BinPackParameters);<br>
>> > +  CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);<br>
>> > +  CHECK_PARSE_BOOL(DerivePointerBinding);<br>
>> > +  CHECK_PARSE_BOOL(IndentCaseLabels);<br>
>> > +  CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);<br>
>> > +  CHECK_PARSE_BOOL(PointerBindsToType);<br>
>> > +<br>
>> > +  CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset,<br>
>> > -1234);<br>
>> > +  CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);<br>
>> > +  CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);<br>
>> > +  CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter,<br>
>> > 1234u);<br>
>> > +  CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",<br>
>> > +              PenaltyReturnTypeOnItsOwnLine, 1234u);<br>
>> > +  CHECK_PARSE("SpacesBeforeTrailingComments: 1234",<br>
>> > +              SpacesBeforeTrailingComments, 1234u);<br>
>> > +<br>
>> > +  Style.Standard = FormatStyle::LS_Auto;<br>
>> > +  CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);<br>
>> > +  CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);<br>
>> > +  CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);<br>
>> > +<br>
>> > +  Style.ColumnLimit = 123;<br>
>> > +  FormatStyle BaseStyle = getLLVMStyle();<br>
>> > +  CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit,<br>
>> > BaseStyle.ColumnLimit);<br>
>> > +  CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit,<br>
>> > 1234u);<br>
>> > +<br>
>> > +#undef CHECK_PARSE<br>
>> > +#undef CHECK_PARSE_BOOL<br>
>> > +}<br>
>> > +<br>
>> > +TEST_F(FormatTest, ConfigurationRoundTripTest) {<br>
>> > +  FormatStyle Style = getLLVMStyle();<br>
>> > +  std::string YAML = configurationAsText(Style);<br>
>> > +  FormatStyle ParsedStyle = {};<br>
>> > +  EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());<br>
>><br>
>> This unit test is failing because of Input::beginMapping in<br>
>> YAMLTraits.cpp.  It uses dyn_cast, but CurrentNode is null (and so it<br>
>> asserts). I don't know enough about YAML to know whether CurrentNode<br>
>> being null is sensible or not.<br>
><br>
><br>
> The failure may be related to this bug in YAML I/O:<br>
> <a href="http://llvm.org/bugs/show_bug.cgi?id=15927" target="_blank">http://llvm.org/bugs/show_bug.cgi?id=15927</a>, but this test passes for me<br>
> (linux on amd64, build type - none, with assertions). Could you provide more<br>
> details on your build configuration/environment? Inserting llvm::errs() <<<br>
> "<" << YAML << ">\n"; after configurationAsText(Style) call could also be<br>
> helpful.<br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div><div><font color="#666666"><span style="border-top-width:2px;border-right-width:0px;border-bottom-width:0px;border-left-width:0px;border-top-style:solid;border-right-style:solid;border-bottom-style:solid;border-left-style:solid;border-top-color:rgb(213,15,37);border-right-color:rgb(213,15,37);border-bottom-color:rgb(213,15,37);border-left-color:rgb(213,15,37);padding-top:2px;margin-top:2px">Alexander Kornienko |</span><span style="border-top-width:2px;border-right-width:0px;border-bottom-width:0px;border-left-width:0px;border-top-style:solid;border-right-style:solid;border-bottom-style:solid;border-left-style:solid;border-top-color:rgb(51,105,232);border-right-color:rgb(51,105,232);border-bottom-color:rgb(51,105,232);border-left-color:rgb(51,105,232);padding-top:2px;margin-top:2px"> Software Engineer |</span></font><span style="border-top-width:2px;border-right-width:0px;border-bottom-width:0px;border-left-width:0px;border-top-style:solid;border-right-style:solid;border-bottom-style:solid;border-left-style:solid;border-top-color:rgb(0,153,57);border-right-color:rgb(0,153,57);border-bottom-color:rgb(0,153,57);border-left-color:rgb(0,153,57);padding-top:2px;margin-top:2px"><font color="#666666"> </font><a href="mailto:alexfh@google.com" style="color:rgb(17,85,204)" target="_blank">alexfh@google.com</a> |</span><span style="border-top-width:2px;border-right-width:0px;border-bottom-width:0px;border-left-width:0px;border-top-style:solid;border-right-style:solid;border-bottom-style:solid;border-left-style:solid;border-top-color:rgb(238,178,17);border-right-color:rgb(238,178,17);border-bottom-color:rgb(238,178,17);border-left-color:rgb(238,178,17);padding-top:2px;margin-top:2px"> <a value="+35315435283" style="color:rgb(17,85,204)">+49 151 221 77 957</a></span></div>
</div><div><font color="#666666"><span style="background-color:rgb(255,255,255);font-family:Arial,Verdana,sans-serif">Google Germany GmbH | </span><span style="background-color:rgb(255,255,255);font-family:Arial,Verdana,sans-serif">Dienerstr. 12 | </span><span style="background-color:rgb(255,255,255);font-family:Arial,Verdana,sans-serif">80331 München</span></font></div>

</div>